为什么 QString 打印带有引号



因此,当您使用 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;

另一种选择是将QTextStreamstdout 一起使用。 文档中有一个示例:

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(); }

它将truefalse输出到您的终端。因此,如果你有一个QString哪个存储true,你需要一个引号"来指定类型。

Qt 4:如果字符串仅包含 ASCII,则以下解决方法会有所帮助:

qDebug() << QString("TEST").toLatin1().data();

简单地投射到const char *

qDebug() << (const char *)yourQString.toStdString().c_str();

一行没有引号:qDebug().noquote() << QString("string");

相关内容

  • 没有找到相关文章

最新更新