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
しかし、終了改行を取り除く方法をまだ見つけていないことに注意してください。
/ありがとう
この形式を試してください:qDebug("%s=%d", "string", 1);
この場合、qDebug
は printf formatを使用します
追伸あなたの例に適応:qDebug("%s=%d", var1.toStdString().c_str(), var2);
QDebug
が内部的にどのように機能するかを理解することが最善です。そうすれば、ニーズに合わせて簡単に変更できます。 qDebug()
関数を使用するたびに、QDebug
オブジェクトが返されます。デフォルトでは、QDebug
は、operator <<
を使用した後に常にスペースを出力します。
QDebug
クラスには、内部的にQString
が含まれています。 operator <<
を使用するたびに、その内部QStringに追加します。このQStringは、QDebug
オブジェクトが破棄されるときにqt_message_output(QtMsgType, char*)
を介して出力されます。
デフォルトでは、qt_message_output
は常に文字列とそれに続く改行を出力します。
qDebug() << "Var" << 1;
これにより、Var 1
が出力されます。これは、qDebug
が_operator <<
を呼び出すたびにスペースを追加するQDebug
オブジェクトを作成するためです。したがって、それはVar
+ + 1 +になります。
QDebug::nospace
を使用して、QDebug
にoperator <<
を呼び出すたびにスペースを追加しないように指示できます。
qDebug().nospace() << "Var" << 1;
QDebug
オブジェクトがスペースを印刷しなくなったため、これはVar1
を出力します。
文字列の最後に\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
関数を使用して、文字列を printf
と同様の形式で印刷することもできます。これにより、QDebug
によって追加される余分なスペースを回避できます。
ただし、 qDebug
は内部的にqt_message_output
を使用しているため、独自のハンドラーをインストールしない限り、最後に改行が追加されます。
Qt 5.4以降では、次のことも記述できます。
qDebug().nospace().noquote() << var1;
上記の回答のいくつかを組み合わせて使用できます
qDebug() << qPrintable(var1);
周囲の引用符を削除します。
引用符の問題も経験しました。解決策は、QString()
をストリームにパイプするのではなく、QString(...).toStdString().c_str()
にパイプすることです。
これを簡単に回避するために、小さな便利なマクロを自分で作成しました。
#define Q(string) (string).toStdString().c_str()
QStringを使用するたびに、次のようにします。
qDebug() << Q(var1) << "=" << var2;
ファイル$(QTDIR)/src/corelib/io/qdebug.hには、デバッグ出力メソッドのほぼすべての定義が含まれています。それらの1つは:
インラインQDebug&operator <<(const QString&t){stream-> ts << '\ "' << t << '\"'; maybeSpace(); }
したがって、引用符を抑制する「公式な」方法はありませんが、もちろん、qdebug.hを変更したり、QDebugクラスの独自のコピーまたは変更して名前を変更したコピーを使用することができます。
別の方法は、 own message handler を使用することです。
お役に立てれば。