13

qDebug()ステートメントがQtの標準メッセージハンドラーで正常に機能するが、自分自身に切り替えると失敗する理由を探し回った後、他の誰かがこの問題の経験があるかどうかを確認するためにここでアピールしています。

私が知っている/試したこと、それは何もしません...

1)CONFIG += console

2)DEFINES -= QT_NO_WARNING_OUTPUT QT_NO_DEBUG_OUTPUT

3)::fprintf(stderr, "ERROR\n"); ::fflush(stderr);

4)::fprintf(stdout, "OUTPUT\n"); ::fflush(stdout);

5)std::cerr << "CERROR" << std::endl; std::cerr.flush();

ただし、組み込みハンドラーを使用すると正しく機能します(つまり、メッセージをQtCreatorコンソールに出力します)

int main(int argc, char *argv[]) {
    // Use my handler
    qInstallMessageHandler(MyCustomLogger);
    qDebug() << "Not Printed";

    // Use standard handler
    qInstallMessageHandler(0);
    qDebug() << "Correctly Printed";

    // Use my handler again
    qInstallMessageHandler(MyCustomLogger);
    qDebug() << "Not Printed Again...";
}

最新のテストでは、WinAPIコマンドを使用して自分自身にコンソールを割り当てました。これにより、stderrおよびstdoutへのすべての出力が正しい動作になり、作成したコンソールに表示されます。ただし、これは私が望む動作ではありません。QtCreatorでこの出力を表示できるようにしたいと思います。

標準のメッセージハンドラーがデバッガーにどのように出力されるかについて何か考えはありますか?私はまだQtソースでそれを見つけることができませんでした。

4

2 に答える 2

15

フランクオスターフェルトが彼のコメントで述べたように:

Windowsでは、qDebug()はstderrではなくデバッグチャネルを使用します。

QDebugコードとQMessageLoggerを詳しく調べた後、答えが見つかりました。便利なWinAPI関数OutputDebugString

使用法(ペッペから変更):

#include <QApplication>
#include <QtDebug>
#include <QtGlobal>

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

void MyMessageOutput(QtMsgType Type, const QMessageLogContext& Context, const QString &Message)
{
    OutputDebugString(reinterpret_cast<const wchar_t *>(Message.utf16()));
}

int main(int argc, char **argv)
{
    // A GUI application
    QApplication app(argc, argv);

    // Custom handler
    qInstallMessageHandler(myMessageOutput);
    qDebug() << "Printed in the console using my message handler in a windows GUI application";

    // Default handler
    qInstallMessageHandler(0);
    qDebug() << "Also printed in the console!";

    // Show GUI here
    //MainForm *MF = new MainForm();
    //MF->show();

    return app.exec();
}
于 2013-02-03T13:13:32.513 に答える
2

問題を再現できません。これは私にとっては正しく機能します。

#include <QCoreApplication>
#include <QtDebug>
#include <QtGlobal>

#include <stdio.h>
#include <stdlib.h>

void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    QByteArray localMsg = msg.toLocal8Bit();
    fprintf(stderr, "MESSAGE (%s:%u %s): %s\n", context.file, context.line, context.function, localMsg.constData());
    fflush(stderr);
}

int main(int argc, char **argv)
{
    QCoreApplication app(argc, argv);
    qInstallMessageHandler(myMessageOutput);
    qDebug() << "Printed in the console";
    qInstallMessageHandler(0);
    qDebug() << "Also printed in the console";
    return app.exec();
}
于 2013-02-01T09:54:48.547 に答える