【问题标题】:How to get QString qDebug output as string?如何将 QString qDebug 输出作为字符串?
【发布时间】:2019-05-19 03:54:20
【问题描述】:

让我们看看这个小应用程序:

#include <QString>
#include <QDebug>

int main(int argc, char *argv[]) {
  const auto test_string = 
    QString{"Some string \n \x01 \u0002 with some \r special chars"};
  qDebug() << test_string;
  qDebug(qPrintable(test_string));
}

它给出以下输出:

"Some string \n \u0001 \u0002 with some \r special chars"
Some string
 special chars
Press <RETURN> to close this window...

这演示了 qDebug

我想使用此功能将字符串输入自定义日志框架。有没有可能直接使用同一个转换函数?

实际上,这意味着将 test_string 转换为 QString 实例,该实例在上述两个 qDebug 语句上提供相同的输出。

【问题讨论】:

  • 我寻找了QDebug::operator&lt;&lt;(const QString&amp;) 的实现,最终得到了一个函数模板static inline putEscapedString()。顺便提一句。我发现QDebug 有一个构造函数,可以在其中传递QString。因此,您可以将 QDebug 实例化为 QString 以将其用作格式化程序。对我来说,这似乎不那么烦人,因为只是从 putEscapedString() 复制源代码来制作自己的格式化程序,但后者也可能是一种选择。
  • bitbucket.org/codeimproved/qslog 请检查这个。所以适度似乎决定我应该复制粘贴 qslog 的实现作为我的答案。没门。在。地狱。

标签: qt qstring qdebug


【解决方案1】:

我有同样的问题,但我没有找到完整的答案(还)。但是,我发现 QVariant 允许您在最基本的 C 和 Qt 类型上调用 toString()

QVariant("foo").toString(); // "foo"
QVariant(true).toString(); // "true"
QVariant(QDateTime("2020-11-28")).toString(); // "2020-11-28"

然后你可以把它包装成一个方法:

QString variantToString(const QVariant variant) {
    return (variant.userType() != QMetaType::QString
            && variant.canConvert(QMetaType::QStringList))
        ? "(" + variant.toStringList().join(", ") + ")"
        : variant.toString();
}

variantToString(42); // "42" // works due to implicit cast

您可以对不可字符串化的类型进行一些额外的检查(另请参阅 canConvert()userType(),例如列表、正则表达式或您需要的任何内容,但我完全同意重用 Qt 自己的日志记录会更好代替函数...

【讨论】:

    猜你喜欢
    • 2013-08-27
    • 2015-10-26
    • 1970-01-01
    • 2010-12-21
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    相关资源
    最近更新 更多