2

バックグラウンド:

私は Qt を使用してqInstallMsgHandler()おりqDebug()、これは GUI アプリケーションです。

私のメッセージ ハンドラーは、Qt のqtglobal::qInstallMsgHandler()ドキュメント hereに示されているメッセージ ハンドラーの例と同じです。

Linux 対 Windows:

Linux では、呼び出されるたびqDebug()にメッセージがすぐにコンソールに表示されます...これは良いことであり、期待どおりです。

Windows では、 が呼び出されるたびqDebug()にメッセージがコンソールに表示されません。代わりに、コンソールには何も表示されません。次に、アプリケーションを閉じると、すべてのメッセージがコンソールに突然表示されます。

質問:

Windows での Qt コンソール出力をどのように修正しますか (qInstallMsgHandler()およびを使用qDebug())?

4

1 に答える 1

3

Windows では、メッセージ ハンドラは のfflush(stderr)後に実行されている必要がありますfprintf()なぜこの追加が必要なのかわかりませんfflush()が、機能します。


長い話:

qInstallMsgHandler() を呼び出す前に、qDebug() メッセージが実際に qDebug() への各呼び出しの直後に表示されることに気付きました。

直感で、qDebug() 関数を調べることにしました。たまたま Windows で Qt をソースからビルドしたので、qDebug() ソース コードを調べたところ、メッセージ ハンドラーがない場合、デフォルトのメッセージ ハンドラーの短いコード スニペットがあることがわかりました。このスニペットの本質は次のとおりです。

if (handler) {
    (*handler)(msgType, buf);
} else {
    fprintf(stderr, "%s\n", buf);
    fflush(stderr);
}

メッセージ ハンドラーに追加fflush(stderr)したところ、qDebug() メッセージが表示されるようになりました。


qDebug() に関する Qt ドキュメントからの警告:

Windows では、[your application] がコンソール アプリケーションの場合、メッセージはコンソールに送信されます。それ以外の場合 [アプリケーションが GUI アプリケーションの場合]、[メッセージ] が debugger に送信されます。コンパイル時に QT_NO_DEBUG_OUTPUT が定義されている場合、この関数は何もしません。

(注: 強調は私が追加したものです。角括弧内のテキストは私自身のものです。)

于 2013-01-03T14:57:24.933 に答える