61

C ++ / Qtの印刷関数qDebugを使用していますが、スペースと改行の追加方法を制御したい場合があり、デフォルトのqDebugを使用しません。

簡単な例を見てみましょう。

QString var1("some string");
int var2 = 1;
qDebug() << var1 << "=" << var2;

これは印刷されます

"some string" = 1 

しかし、私が追加された「」とスペースが好きではなく、プリントを次のように見せたいとしましょう。

some string=1 

次にqDebugを呼び出すにはどうすればよいですか?


注:qDebugにはnospaceという関数がありますが、スペースが削除されます。しかし、「はまだそこにあります。

これを使用する場合:

qDebug().nospace() << var1 << "=" << var2;

私は得る:

"some string"=1

ただし、末尾の改行を削除する方法がまだ見つかっていないことに注意してください。

/ありがとう

4

7 に答える 7

94

QDebug内部でどのように機能するかを理解するのが最善です。そうすれば、ニーズに合わせて簡単に変更できます。qDebug()この関数を使用するたびに、QDebugオブジェクトが返されます。デフォルトQDebugでは、を使用した後は常にスペースを出力しますoperator <<

クラスにはQDebug内部的にが含まれていQStringます。使用するたびoperator <<に、その内部QStringに追加します。このQStringは、オブジェクトが破棄されqt_message_output(QtMsgType, char*)たときに印刷されます。QDebug

デフォルトqt_message_outputでは、常に文字列の後に改行が続きます。

通常の出力

qDebug() << "Var" << 1;

これにより、が出力されますVar 1。これは、を呼び出すたびにスペースを追加するオブジェクトをqDebug作成するためです。つまり、+ +1+になります。QDebugoperator <<Var

スペースなし

を呼び出すたびにスペースを追加しないようQDebug::nospaceに指示するために使用できます。QDebugoperator <<

qDebug().nospace() << "Var" << 1;

Var1そのQDebugオブジェクトはもはやスペースを印刷していないので、これは出力されます。

新しい行なし

文字列の最後にを追加しないの\nは少し難しいです。QDebug内部的には文字列が破棄されたときにのみ文字列を渡すため、qt_message_outputそのQDebugオブジェクトの破棄を遅らせることができます-

QDebug deb = qDebug();
deb << "One" << "Two";
deb << "Three";

これにより、新しい行が印刷さOne Two Threeれて追加されます。

新しい行を印刷したくない場合は、の動作を変更する必要がありますqt_message_outputこれは、カスタムハンドラーをインストールすることで実行できます。

void customHandler(QtMsgType type, const char* msg) {
    fprintf(stderr, msg);
    fflush(stderr);
}

// Somewhere in your program
qInstallMsgHandler(customHandler);

qDebug() << "One" << "Two";
qDebug().noSpace() << "Three" << "Four";

これは印刷されますOne Two ThreeFour

これは、プログラム内のすべてのqDebugステートメントに影響することに注意してください。カスタムハンドラーを削除する場合は、を呼び出す必要がありますqInstallMsgHandler(0)

qDebug(const char * msg、...)

他の回答で示されているように、このqDebug関数を使用して、と同様の形式で文字列を印刷することもできますprintf。このようにして、によって追加される余分なスペースを回避できますQDebug

ただし、qDebug内部では引き続きを使用qt_message_outputするため、独自のハンドラーをインストールしない限り、最後に改行を取得します。

于 2013-03-22T19:01:39.980 に答える
57

この形式を試してください:qDebug("%s=%d", "string", 1); この場合、 printf形式qDebugを使用します

PSあなたの例に適応:qDebug("%s=%d", var1.toStdString().c_str(), var2);

于 2011-03-06T10:40:47.250 に答える
28

Qt 5.4以降、次のように書くこともできます。

qDebug().nospace().noquote() << var1;
于 2015-01-12T09:26:16.353 に答える
20

上記の回答のいくつかを組み合わせて使用​​できます

qDebug() << qPrintable(var1);

周囲の引用符を削除します。

于 2013-02-11T15:07:21.787 に答える
7

見積もりの​​問題も発生しました。QString()解決策は、ストリームにパイプするのではなく、代わりにパイプすることですQString(...).toStdString().c_str()

これを簡単に回避するために、小さな便利なマクロを自分で作成しました。

#define Q(string) (string).toStdString().c_str()

これで、QStringを使用するたびに、次のようにします。

qDebug() << Q(var1) << "=" << var2;
于 2011-09-27T12:29:50.680 に答える
5

ファイル$(QTDIR)/src/corelib/io/qdebug.hには、デバッグ出力メソッドのほぼすべての定義が含まれています。それらの1つは次のとおりです。

インラインQDebug&operator <<(const QString&t){stream-> ts <<'\ "'<< t <<'\"'; 戻り値maybeSpace(); }

したがって、引用符を抑制する「公式の」方法はありませんが、もちろんqdebug.hを変更するか、独自のコピーまたはQDebugクラスの変更および名前変更されたコピーを使用できます。

于 2011-03-06T10:23:48.027 に答える
0

もう1つの方法は、独自のメッセージハンドラーを使用することです。
お役に立てれば。

于 2011-03-06T11:35:13.497 に答える