因此,当您使用 qDebug()
打印QString
时,引号突然出现在输出中。
int main()
{
QString str = "hello world"; //Classic
qDebug() << str; //Output: "hello world"
//Expected Ouput: hello world
}
我知道我们可以用qPrintable(const QString)
解决这个问题,但我只是想知道为什么QString
那样工作?,QString
里面有没有一种方法可以改变它的打印方式?
Qt 5.4有一个新功能,可以让你禁用它。 引用文档:
QDebug & QDebug::noquote()
禁用在 QChar、QString 和 QByteArray 内容周围自动插入引号字符,并返回对 流。
此功能在Qt 5.4中引入。
另请参阅 quote() 和 maybeQuote()。
(强调我的。
下面是如何使用此功能的示例:
QDebug debug = qDebug();
debug << QString("This string is quoted") << endl;
debug.noquote();
debug << QString("This string is not") << endl;
另一种选择是将QTextStream
与 stdout
一起使用。 文档中有一个示例:
QTextStream out(stdout);
out << "Qt rocks!" << endl;
为什么?
这是因为qDebug()
的实施.
从源代码:
inline QDebug &operator<<(QChar t) { stream->ts << ''' << t << '''; return maybeSpace(); }
inline QDebug &operator<<(const char* t) { stream->ts << QString::fromAscii(t); return maybeSpace(); }
inline QDebug &operator<<(const QString & t) { stream->ts << '"' << t << '"'; return maybeSpace(); }
因此
QChar a = 'H';
char b = 'H';
QString c = "Hello";
qDebug()<<a;
qDebug()<<b;
qDebug()<<c;
输出
'H'
H
"Hello"
<小时 />评论
那么Qt为什么要这样做呢?由于qDebug
是为了调试,因此各种类型的输入将通过qDebug
变成文本流输出。
例如,qDebug
将布尔值打印到文本表达式 true
/false
中:
inline QDebug &operator<<(bool t) { stream->ts << (t ? "true" : "false"); return maybeSpace(); }
它将true
或false
输出到您的终端。因此,如果你有一个QString
哪个存储true
,你需要一个引号"
来指定类型。
Qt 4:如果字符串仅包含 ASCII,则以下解决方法会有所帮助:
qDebug() << QString("TEST").toLatin1().data();
简单地投射到const char *
qDebug() << (const char *)yourQString.toStdString().c_str();
一行没有引号:qDebug().noquote() << QString("string");