web-dev-qa-db-ja.com

QStringが引用符で印刷されるのはなぜですか?

したがって、qDebug()を使用してQStringを出力すると、出力に突然引用符が表示されます。

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

qPrintable(const QString)でこれを解決できることは知っていますが、なぜQStringがそのように機能するのか疑問に思っていました。また、QString内に方法を変更するメソッドがありますか。印刷?

16
Michael

どうして?

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がある場合は、タイプを指定するために引用符"が必要です。

13
Tay2510

Qt 5.4には、これを無効にできる新機能があります。引用するには ドキュメント

QDebug&QDebug :: noquote()

QChar、QString、およびQByteArrayの内容を引用符で囲む自動挿入を無効にし、ストリームへの参照を返します。

この機能はQt5.4で導入されました。

Quote()およびmaybeQuote()も参照してください。

(エンファシスマイン。)

この機能の使用方法の例を次に示します。

QDebug debug = qDebug();
debug << QString("This string is quoted") << endl;
debug.noquote();
debug << QString("This string is not") << endl;

もう1つのオプションは、QTextStreamstdoutとともに使用することです。 ドキュメント にこの例があります:

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

Qt 4:文字列にASCIIのみが含まれている場合、次の回避策が役立ちます。

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

const char *にキャストするだけです

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