为什么QString印有引号?

Mic*_*ael 15 qstring qt qdebug

因此,当您使用qDebug()打印QString时,输出中会突然出现引号.

int main()
{
    QString str = "hello world"; //Classic
    qDebug() << str; //Output: "hello world"
    //Expected Ouput: hello world
}
Run Code Online (Sandbox Code Playgroud)

我知道我们可以使用qPrintable(const QString)来解决这个问题,但我只是想知道为什么QString会像那样工作?并且QString中是否有一个方法来改变它的打印方式?

MrE*_*Sir 25

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;
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用QTextStreamstdout.文档中有一个例子:

QTextStream out(stdout);
out << "Qt rocks!" << endl;
Run Code Online (Sandbox Code Playgroud)

  • @MrEricSir我正在使用`qDebug().noquote()<< QStringRef(back,i,cols);`...我认为它是一样的,也尝试了你的例子,但我一直得到错误说noquote()不是QDebug的成员,感谢您的帮助,但这可能是因为我的Qt版本.这是Linux版本,它不是真正的5.4而只是基于5.4,也许这就是原因. (3认同)

Tay*_*510 13

为什么?

这是因为实施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(); }
Run Code Online (Sandbox Code Playgroud)

因此,

QChar a = 'H';
char b = 'H';
QString c = "Hello";

qDebug()<<a;
qDebug()<<b;
qDebug()<<c;
Run Code Online (Sandbox Code Playgroud)

输出

'H' 
 H 
"Hello"
Run Code Online (Sandbox Code Playgroud)

评论

那么为什么Qt这样做呢?由于qDebug是为了调试的目的,各种类型的输入将成为文本流输出qDebug.

例如,将qDebugboolean值打印到文本表达式true/中false:

inline QDebug &operator<<(bool t) { stream->ts << (t ? "true" : "false"); return maybeSpace(); }
Run Code Online (Sandbox Code Playgroud)

它输出true或输出false到您的终端.因此,如果您有QString哪个商店true,则需要引号"来指定类型.

  • 提供源代码是一个很好的方法。 (2认同)

小智 5

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

qDebug() << QString("TEST").toLatin1().data();
Run Code Online (Sandbox Code Playgroud)

  • 这实际上是 https://bugreports.qt.io/browse/QTBUG-48517 的有效解决方法。`.data()` 将在 Qt5 中回显字符串内容,就像在 Qt4 中一样。我确定它因为不必要的“toLatin1”而被否决,但这可以更改为“toUtf8”等。 (3认同)