【问题标题】:Why is QString printed with quotation marks?为什么 QString 打印带引号?
【发布时间】:2015-03-14 14:56:11
【问题描述】:

所以当您使用qDebug() 打印QString 时,输出中会突然出现引号。

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

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

【问题讨论】:

标签: qt qstring qdebug


【解决方案1】:

单行无引号:qDebug().noquote() &lt;&lt; QString("string");

【讨论】:

  • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
  • 它确实回答了 QString 中是否有方法来改变它的打印方式?一个衬里
【解决方案2】:

只需转换为const char *

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

【讨论】:

  • Qt 包含一个基本上可以做到这一点的函数:const char * qPrintable ( const QString &amp; str )
  • 文档说,当使用qDebug 时,您应该使用qUtf8Printable,因为 qDebug 需要 UTF-8。
【解决方案3】:

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

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

【讨论】:

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

Qt 5.4 有一个新特性可以让你禁用它。引用the documentation:

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 一起使用。 the documentation 中有一个例子:

QTextStream out(stdout);
out << "Qt rocks!" << endl;

【讨论】:

  • 很高兴知道,谢谢。但不知何故,在编译时,我发现 QDebug::noquote() 在 Linux 版本的 Qt 中没有定义为 QDebug 的成员。可能是因为它只是基于 Qt 5.4。
  • @Michael 我添加了一个示例,看看是否有帮助。
  • @MrEricSir 我正在使用qDebug().noquote() &lt;&lt; QStringRef(back, i, cols);... 我认为它是相同的,并且也尝试了你的示例,但我一直收到错误说 noquote() 不是 QDebug 的成员,谢谢帮助,但这可能是因为我的 Qt 版本。它是 Linux 版本,它不是真正的 5.4,而是基于 5.4,也许这就是原因。
  • 这确实有效,并且在某些情况下可能会有所帮助,但有一个主要缺点:直到 QDebug 对象被销毁时才会打印调试输出(至少在我的系统上),所以你可能在应用程序关闭之前没有调试输出(此时从技术上讲,它不再是调试/日志输出......)
  • 那我们为什么要使用endl呢?
【解决方案5】:

为什么?

这是因为qDebug()的实现。

来自source code

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 输出到您的终端。因此,如果您有一个存储trueQString,则需要一个引号" 来指定类型。

【讨论】:

  • 这就是 qPrintable(const QString) 删除引号的原因。非常感谢。
  • @Michael Nope。我认为只是一些审美问题。 qDebug 只是想强调类型的差异,所以它使用"善意地 提醒您QString 的类型。毕竟是为了调试,不是为了打印。
  • 是的,但是 qPrintable 返回一个 const char* 并且根据您在将 const char* 作为参数传递给
  • @Michael 你说得对。您还可以参考 MrEricSir 的回答以删除引号和我的最后一次编辑以查看 " 背后的动机。
  • 无论如何,这不是“因为”的原因。最重要的“因为”是找出字符串中的前导/尾随空格!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-14
  • 2013-07-09
  • 2017-05-08
  • 1970-01-01
  • 2015-11-28
  • 2021-07-26
  • 1970-01-01
相关资源
最近更新 更多