web-dev-qa-db-ja.com

スペースと改行を追加せずにqDebugを呼び出す方法は?

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

しかし、終了改行を取り除く方法をまだ見つけていないことに注意してください。

/ありがとう

55
Johan

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

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

49
Johnny

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を使用して、QDebugoperator <<を呼び出すたびにスペースを追加しないように指示できます。

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(const char * msg、...)

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

ただし、 qDebug は内部的にqt_message_outputを使用しているため、独自のハンドラーをインストールしない限り、最後に改行が追加されます。

76
Vishesh Handa

Qt 5.4以降では、次のことも記述できます。

qDebug().nospace().noquote() << var1;
26
user4444617

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

qDebug() << qPrintable(var1);

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

20
Tim MB

引用符の問題も経験しました。解決策は、QString()をストリームにパイプするのではなく、QString(...).toStdString().c_str()にパイプすることです。

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

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

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

qDebug() << Q(var1) << "=" << var2;
7
hurikhan77

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

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

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

5
hmuelner

別の方法は、 own message handler を使用することです。
お役に立てれば。

0
zkunov