2

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

#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 实例。

4

1 回答 1

0

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

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 自己的日志记录函数会更好......

于 2020-11-28T21:15:23.830 回答