Russian Qt Forum
Ноябрь 23, 2024, 04:16 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как QtCreator делает вывод в cout при запуске release сборки?  (Прочитано 5781 раз)
Susenin
Новичок

Offline Offline

Сообщений: 35


Просмотр профиля
« : Апрель 18, 2015, 20:21 »

Здравствуйте!

GUI-приложение, Windows 7.
В коде есть вывод данных в std::cout и std::cerr.
При запуске приложения из QtCreator вывод идет в консоль самого QtCreator, как на картинке.
Как Креатор это делает?

И можно ли как-то при запуске приложения без Креатора открыть консоль, чтобы туда валился вывод этого приложения, предназначенный для стандартных потоков?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Апрель 18, 2015, 21:16 »

Цитировать
В коде есть вывод данных в std::cout и std::cerr.

Где?

Цитировать
И можно ли как-то при запуске приложения без Креатора открыть консоль, чтобы туда валился вывод этого приложения, предназначенный для стандартных потоков?

Собрать GUI приложение с соответствующим флагом (например CONFIG += console для qmake). Тогда при запуске GUI приложения будет автоматом запускаться консоль куда и будут выводиться логи.

Но лучше логи выводить через QDebug и иже с ними (для Qt5 есть даже "logging framework"). В этом случае их можно посмотреть через утилиту DebugView. Но это все актуально для Windows.
« Последнее редактирование: Апрель 18, 2015, 21:22 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Susenin
Новичок

Offline Offline

Сообщений: 35


Просмотр профиля
« Ответ #2 : Апрель 19, 2015, 02:08 »

Цитировать
В коде есть вывод данных в 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/58667
https://bobobobo.wordpress.com/2009/03/01/how-to-attach-a-console-to-your-gui-app-in-c/

2 вариант
Отладочную информацию передаем в функцию OutputDebugString (тоже WinAPI). И смотрим программой DebugView

Остается вопрос - как QtCreator перенаправляет потоки вывода себе в Application Output, когда приложение запускается из него?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #3 : Апрель 19, 2015, 13:30 »

Цитировать
У Креаторе же это получается? Как?
Остается вопрос - как QtCreator перенаправляет потоки вывода себе в Application Output, когда приложение запускается из него?

Что мешает посмотреть его сорцы?

Скорее всего через QProcess и читает его выхлоп.

Цитировать
1 вариант.
2 вариант

Не нужно никаких заморочек с переопределением MessageHandler и прочее, ИМХО. Достаточно использовать только qDebug/Warning/Critical или аналогичные из Logging Framework. Они уже внутри вызывают OutputDebugString и прочее (я про Qt5).
Записан

ArchLinux x86_64 / Win10 64 bit
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #4 : Апрель 20, 2015, 13:31 »

в qt4 было удобнее - если запуск из консоли - есть вывод в консоль, если мышой - нет вывода
в qt5 сделали иначе (как на разобрался), приходится прибивать консоль (некрасиво, но мне нужен вывод в консоль без окна консоли)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.529 секунд. Запросов: 23.