Russian Qt Forum

Qt => Общие вопросы => Тема начата: juvf от Ноябрь 03, 2020, 10:04



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

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


Название: Re: Вывод приложения в консоль
Отправлено: tux от Ноябрь 03, 2020, 10:30
Вы про это? https://stackoverflow.com/questions/4954140/how-to-redirect-qdebug-qwarning-qcritical-etc-output


Название: Re: Вывод приложения в консоль
Отправлено: juvf от Ноябрь 03, 2020, 12:03
Вы про это? https://stackoverflow.com/questions/4954140/how-to-redirect-qdebug-qwarning-qcritical-etc-output
Не совсем. Это решение для qDebug. Но std::cout это не перенаправит в мой виджет.

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


Название: Re: Вывод приложения в консоль
Отправлено: tux от Ноябрь 03, 2020, 13:02
Сомнительно, что такое можно вообще сделать мультиплатформенно.
Кстати, а конвейер не подойдёт7 Я имею в виду
Код:
prog1 | prog2


Название: Re: Вывод приложения в консоль
Отправлено: juvf от Ноябрь 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....) и запустит моё приложение. Утилита передаст дескриптор(указатель, адрес) моему приложению через аргументы при запуске, и при запуске перенаправит весь вывод моего приложения в этот канал?
Что-то подобное взлетит?


Название: Re: Вывод приложения в консоль
Отправлено: tux от Ноябрь 03, 2020, 13:17
что за "prog1 | prog2"?
Ну, это передача выходного потока одной программы во входной поток другой. Его ещё "труба" называют. :) Я, правда понятия не имею, есть ли подобное в винде.
Кстати, через локальные сокеты тоже вполне пойдёт. Оно вот точно мультиплатформенно.
P.S. Хотя... pipe это как и есть та самая "труба". Но, реализацию, увы, не подскажу. :(


Название: Re: Вывод приложения в консоль
Отправлено: qate от Ноябрь 03, 2020, 23:16
обязательно в виджет или файла, который будет иметь весь консольный вывод, будет достаточно ?


Название: Re: Вывод приложения в консоль
Отправлено: juvf от Ноябрь 04, 2020, 09:11
обязательно в виджет или файла, который будет иметь весь консольный вывод, будет достаточно ?

да


Название: Re: Вывод приложения в консоль
Отправлено: tux от Ноябрь 04, 2020, 09:46
Код:
my_prog >> log.out


Название: Re: Вывод приложения в консоль
Отправлено: juvf от Ноябрь 04, 2020, 09:48
my_prog >> log.out
[/quoteа в виджет?


Название: Re: Вывод приложения в консоль
Отправлено: tux от Ноябрь 04, 2020, 09:49
my_prog >> log.out
[/quoteа в виджет?
В файл на диске. Чуть выше было согласие на такое.


Название: Re: Вывод приложения в консоль
Отправлено: juvf от Ноябрь 04, 2020, 09:52
Цитировать
обязательно в виджет или файла?
согласие было в виджет или файл.

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


Название: Re: Вывод приложения в консоль
Отправлено: tux от Ноябрь 04, 2020, 10:00
в файл не очень хорошая затея, т.к. размер файла не будет контролироваться.
Тогда остаётся только "труба". Я с pipe как-то даже делал что-то. Но - давно. А сейчас, банально, нет винды. Совсем.


Название: Re: Вывод приложения в консоль
Отправлено: qate от Ноябрь 04, 2020, 11:17
в файл не очень хорошая затея, т.к. размер файла не будет контролироваться.

файл можно обнулять по таймеру
чуть позже накидаю как я делаю


Название: Re: Вывод приложения в консоль
Отправлено: qate от Ноябрь 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);

Ничего лучшего для венды я придумать не смог, но для пользователя всё это незаметно - дабл клик по иконке на рабочем столе как обычно.


Название: Re: Вывод приложения в консоль
Отправлено: juvf от Ноябрь 05, 2020, 06:42
...
Ничего лучшего для венды я придумать не смог, но для пользователя всё это незаметно - дабл клик по иконке на рабочем столе как обычно.

1) Я не админ, я программист, пишущий ПО. Я написал прогу и отдал пользователю (портабл либо сетап). Ковырять его ПК (системные файлы, реестры, погоды....) я не могу и не буду. Допустим я сетапником смогу закинуть hidec.exe в c:\windows\system32 (тут ещё вопрос, будет ли hidec.exe работать на чужой винде?) Можно hidec.exe положить не в c:\windows\system32, а рядом с MyProgram.ехе?

2)далее.... запустится моя прога со скрытой консолью. Как, во время работы MyProgram.ехе, открыть консоль и посмотреть что там? А потом опять закрыть?


Название: Re: Вывод приложения в консоль
Отправлено: qate от Ноябрь 05, 2020, 13:08
1. я тоже не админ-  написал прогу и отдал её пользователю, сделав инсталятор или просто zip
ничего ковырять в системе не надо
hidec.exe - это win-api приложение, конечно она будет работать

2. создаваемый лог файл открой и посмотри, затем закрой )