Как 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.

13

Решение

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

В windows 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();
}
15

Другие решения

Я не могу воспроизвести вашу проблему: у меня это работает правильно.

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

По вопросам рекламы [email protected]