В коде есть вывод данных в std::cout и std::cerr.
Где?
В моем коде
C++ (Qt)
#include <iostream>
#include <exception> // std::set_terminate
#include <QApplication>
#include <QString>
#include "Logic.h"
void myMessageOutput(QtMsgType type, const QMessageLogContext & context, const QString & msg)
{
switch (type)
{
case QtDebugMsg:
std::cerr << QString("Debug: %1 (%2:%3, %4)\n").arg(msg).arg(context.file).arg(context.line).arg(context.function).toStdString();
break;
case QtWarningMsg:
std::cerr << QString("Warning: %1 (%2:%3, %4)\n").arg(msg).arg(context.file).arg(context.line).arg(context.function).toStdString();
break;
case QtCriticalMsg:
std::cerr << QString("Critical: %1 (%2:%3, %4)\n").arg(msg).arg(context.file).arg(context.line).arg(context.function).toStdString();
break;
case QtFatalMsg:
std::cerr << QString("Fatal: %1 (%2:%3, %4)\n").arg(msg).arg(context.file).arg(context.line).arg(context.function).toStdString();
abort();
}
}
void myterminate()
{
std::cerr << "terminate handler called\n";
abort(); // forces abnormal termination
}
int main(int argc, char * argv[])
{
qInstallMessageHandler(myMessageOutput);
std::set_terminate(myterminate);
QApplication a(argc, argv);
Logic l;
return a.exec();
}
И можно ли как-то при запуске приложения без Креатора открыть консоль, чтобы туда валился вывод этого приложения, предназначенный для стандартных потоков?
Собрать GUI приложение с соответствующим флагом (например CONFIG += console для qmake). Тогда при запуске GUI приложения будет автоматом запускаться консоль куда и будут выводиться логи.
Мне хотелось вот чего. Приложение собирается без консоли (CONFIG -= console). Но если есть желание посмотреть отладочную информацию, открывается консоль и какими-то манипуляциями
туда выводится все, что должно выводится в std::cout и std::cerr.
У Креаторе же это получается? Как?
Но лучше логи выводить через QDebug и иже с ними (для Qt5 есть даже "logging framework"). В этом случае их можно посмотреть через утилиту
DebugView. Но это все актуально для Windows.
Спасибо.
Кое-чего получилось.
1 вариант.
Выполняем такой код, когда нужно вызвать консоль(это WinAPI функции):
C++ (Qt)
if (AllocConsole())
{
AttachConsole(GetCurrentProcessId());
freopen( "CON", "w", stdout );
freopen( "CON", "w", stderr );
}
Ссылки по теме:
https://support.microsoft.com/ru-ru/kb/58667https://bobobobo.wordpress.com/2009/03/01/how-to-attach-a-console-to-your-gui-app-in-c/2 вариант
Отладочную информацию передаем в функцию OutputDebugString (тоже WinAPI). И смотрим программой
DebugViewОстается вопрос - как QtCreator перенаправляет потоки вывода себе в Application Output, когда приложение запускается из него?