让我们看一下这个小应用程序:
#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实例。
答案 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自己的日志功能...