如何获取QString qDebug输出为字符串?

时间:2018-12-18 17:10:02

标签: qt qstring qdebug

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

#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 <<运算符如何具有一些功能,该功能将QString的所有特殊字符转换为某些可读的字符串,这些字符串可以轻松地放入C ++的字符串声明中。

我想使用此功能将字符串提供给自定义日志记录框架。是否可以直接使用相同的转换函数?

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

1 个答案:

答案 0 :(得分:0)

我有相同的问题,但尚未找到完整的答案。但是,我发现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自己的日志功能...