Подтвердить что ты не робот

Как Qt5 перенаправляет операторы qDebug() в консоль Qt Creator 2.6

После поиска по той причине, что инструкции 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.

4b9b3361

Ответ 1

Как отметил Фрэнк Остерфельд в своем комментарии:

В окнах qDebug() использует отладочный канал, а не stderr.

После вникания в QDebug-код и QMessageLogger я нашел свой ответ. Удобная функция WinAPI OutputDebugString.

Использование (Изменено из peppe's):

#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();
}

Ответ 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();
}