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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Вывод приложения в консоль  (Прочитано 7973 раз)
juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« : Ноябрь 03, 2020, 10:04 »

Добрый день.
Очень часто прогеры пишут Qt GUI приложение и запускают с консолью. Приложение запускается в 2-х окнах: само приложение как GUI и отдельное окошко с консолью. Это дополнительное окошко пользователю не нужно (если оно нужно, то перереши приложение так, чтобы оно было не нужно). Как в Qt эту консоль можно реализовать виджетом (например QDocWidget)?

Как сделать докВиджет я знаю. Как перенаправить весь хлам из консоли в этот виджет? Как перенаправить/перехватить сообщения от всяких std::cout, qDebug(), printf(), system, curl, и т.п. ?
Записан
tux
Крякер
****
Offline Offline

Сообщений: 399



Просмотр профиля
« Ответ #1 : Ноябрь 03, 2020, 10:30 »

Вы про это? https://stackoverflow.com/questions/4954140/how-to-redirect-qdebug-qwarning-qcritical-etc-output
Записан

juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« Ответ #2 : Ноябрь 03, 2020, 12:03 »

Не совсем. Это решение для qDebug. Но std::cout это не перенаправит в мой виджет.

А также, в программе можно сделать системный вызов, например  system("some_progpam -a -p 192.168.1.2"); И этот системный вызов вернёт в консоль ответ, такой, как если бы из консоли терминала выполнить "some_progpam -a -p 192.168.1.2". Этот вывод я бы тоже хотел перехватить.
Записан
tux
Крякер
****
Offline Offline

Сообщений: 399



Просмотр профиля
« Ответ #3 : Ноябрь 03, 2020, 13:02 »

Сомнительно, что такое можно вообще сделать мультиплатформенно.
Кстати, а конвейер не подойдёт7 Я имею в виду
Код:
prog1 | prog2
Записан

juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« Ответ #4 : Ноябрь 03, 2020, 13:13 »

Сомнительно, что такое можно вообще сделать мультиплатформенно.
Кстати, а конвейер не подойдёт7 Я имею в виду
Код:
prog1 | prog2
Мне мультиплатформенно не нужно. Только в винде.
Я тоже сомневаюсь, что есть готовое красивое решение.... но тем не менее...

что за "prog1 | prog2"?


Можно вроде как из консоли запустить бинарник(не только Qt-ый, а вообще любой), и весь вывод перенаправить куданить, например в /dev/null, или в файл. По крайне мере такое возможно в Linux.
Может быть так же при запуске перенаправить весь вывод в /home/user/myPipe (или как это в винде? c:/user/appdata/myPipe), а моё приложение создаст этот pipe и будет с него всё выгребать и перенаправлять в виджет?
Или написать утилиту, которая создаст канал (pipe, stream, file, tcpSocked....) и запустит моё приложение. Утилита передаст дескриптор(указатель, адрес) моему приложению через аргументы при запуске, и при запуске перенаправит весь вывод моего приложения в этот канал?
Что-то подобное взлетит?
Записан
tux
Крякер
****
Offline Offline

Сообщений: 399



Просмотр профиля
« Ответ #5 : Ноябрь 03, 2020, 13:17 »

что за "prog1 | prog2"?
Ну, это передача выходного потока одной программы во входной поток другой. Его ещё "труба" называют. Улыбающийся Я, правда понятия не имею, есть ли подобное в винде.
Кстати, через локальные сокеты тоже вполне пойдёт. Оно вот точно мультиплатформенно.
P.S. Хотя... pipe это как и есть та самая "труба". Но, реализацию, увы, не подскажу. Грустный
Записан

qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #6 : Ноябрь 03, 2020, 23:16 »

обязательно в виджет или файла, который будет иметь весь консольный вывод, будет достаточно ?
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« Ответ #7 : Ноябрь 04, 2020, 09:11 »

обязательно в виджет или файла, который будет иметь весь консольный вывод, будет достаточно ?

да
Записан
tux
Крякер
****
Offline Offline

Сообщений: 399



Просмотр профиля
« Ответ #8 : Ноябрь 04, 2020, 09:46 »

Код:
my_prog >> log.out
« Последнее редактирование: Ноябрь 04, 2020, 09:48 от tux » Записан

juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« Ответ #9 : Ноябрь 04, 2020, 09:48 »

my_prog >> log.out
[/quoteа в виджет?
Записан
tux
Крякер
****
Offline Offline

Сообщений: 399



Просмотр профиля
« Ответ #10 : Ноябрь 04, 2020, 09:49 »

my_prog >> log.out
[/quoteа в виджет?
В файл на диске. Чуть выше было согласие на такое.
Записан

juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« Ответ #11 : Ноябрь 04, 2020, 09:52 »

Цитировать
обязательно в виджет или файла?
согласие было в виджет или файл.

в файл не очень хорошая затея, т.к. размер файла не будет контролироваться.
Записан
tux
Крякер
****
Offline Offline

Сообщений: 399



Просмотр профиля
« Ответ #12 : Ноябрь 04, 2020, 10:00 »

в файл не очень хорошая затея, т.к. размер файла не будет контролироваться.
Тогда остаётся только "труба". Я с pipe как-то даже делал что-то. Но - давно. А сейчас, банально, нет винды. Совсем.
Записан

qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #13 : Ноябрь 04, 2020, 11:17 »

в файл не очень хорошая затея, т.к. размер файла не будет контролироваться.

файл можно обнулять по таймеру
чуть позже накидаю как я делаю
Записан
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #14 : Ноябрь 05, 2020, 00:49 »

1. Запуск программы выполняется через bat файл MyProgram.bat: MyProgram.exe 2>&1 | tee log_file_[currentdatetime].txt
tee.exe - программа из состава cigwin
это обеспечивает вывод в "консольное черное окно" и далее в файл даже несмотря на то, что в pro файле стоит CONFIG -= console и следовательно при линковке: -Wl,-subsystem,windows
для отладки это удобно
currentdatetime - текущее время, или число секунд от эпохи

2. т.к. "консольное черное окно" - пользователю неугодно видеть, то его надо скрыть
делает это простейшая программа hidec.exe http://forum.oszone.net/showthread.php?t=29630

3. Итоговый запуск программы выполняет MyProgramRunner.exe, который состоит из одной функции:
CreateProcess(NULL, "hidec.exe MyProgram.bat", NULL, NULL, FALSE, CREATE_NEW_PROCESS_GROUP, NULL, NULL, &cif, &pi);

Ничего лучшего для венды я придумать не смог, но для пользователя всё это незаметно - дабл клик по иконке на рабочем столе как обычно.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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