Russian Qt Forum

Qt => Общие вопросы => Тема начата: Иволга от Май 04, 2017, 11:48



Название: Перехват stdout
Отправлено: Иволга от Май 04, 2017, 11:48
Добрый день.

Может ли программа на Qt перехватывать свой собственный stdout (для перенаправления в виджет)?
Используются классы, которые пишут в stdout, и переделывать их нежелательно. Классы работают в отдельном потоке.
Использовать их в другом процессе - не вариант.


Название: Re: Перехват stdout
Отправлено: gil9red от Май 04, 2017, 11:52
Тут (http://stackoverflow.com/questions/4810516/c-redirecting-stdout) подсказали, что нужно сделать свою реализацию streambuf (http://www.cplusplus.com/reference/streambuf/streambuf/) и в ней обрабатывать ввод в stdout

Код
C++ (Qt)
your_stream_buffer new_buffer;
streambuf* old_buffer = cout.rdbuf(&new_buffer);
 
cout << "Hello"; // This will be redirected to `new_buffer`.
 
// Restore original buffer:
cout.rdbuf(old_buffer);


Название: Re: Перехват stdout
Отправлено: qate от Май 04, 2017, 16:27
тоже через rdbuf делал, но както потом из потоков писанина вешалась
не стал разбираться, убрал такие поделки
хотя может оно и будет работать, но мне и в консоле все видно хорошо, а там еще и цветом подсветка есть (на венде может и нету)


Название: Re: Перехват stdout
Отправлено: vic57 от Май 04, 2017, 17:18
Используются классы, которые пишут в stdout, и переделывать их нежелательно.
можно через pipe
Код
Bash
proc1 | proc2
 


Название: Re: Перехват stdout
Отправлено: titan83 от Май 04, 2017, 18:34
Автор, похоже, так и не нашел туляка-кутешника))
поэтому накину свои 5 копеек: "свой stdout" вы как делаете? Если с помощью qDebug и компании, то самое простое в вашей ситуации - перехватить вывод этих функций.
После Qt5.2 стало совсем шоколадно: появился http://doc.qt.io/qt-5/qloggingcategory.html#details
Я в своей последней поделке задумался, что не хочу делать свой колхоз по логгированию из разных классов, поэтому просто перехватил весь вывод, и пишу сразу и в QTextEdit, и в файл.
Очень удобно: qCInfo() << "Database connected", вместо emit InfoLog("Databse connected")  и сопутствующей обвязки.
Ну и до кучи: http://doc.qt.io/qt-5/qtglobal.html#qInstallMessageHandler


Название: Re: Перехват stdout
Отправлено: Иволга от Май 05, 2017, 08:46
Всем спасибо ;D, простого и понятного способа вроде QProcess::readAllStandardOutput(), на какой я надеялась, похоже нету, заморачиваться со сложными неохота, поэтому буду переделывать классы.
Цитировать
Автор, похоже, так и не нашел туляка-кутешника))
Даже если бы нашёл, вряд ли бы он помог мне. Я работаю с Qt 10 лет уже (начинала ещё в 3-й версии), поэтому простых вопросов здесь не задаю.  ;)
Цитировать
поэтому накину свои 5 копеек: "свой stdout" вы как делаете?
Через printf и cout, классы пришли из не Qt-шного проекта, и должна сохраниться возможность использовать их без графики. Поэтому добавлю emit logMessage(QString);
Возможности 5-й версии мне недоступны, т.к. пишу в 4.8.6, таково требование заказчика.


Название: Re: Перехват stdout
Отправлено: titan83 от Май 05, 2017, 12:22
--> Я работаю с Qt 10 лет уже
Strong.
--> Поэтому добавлю emit logMessage(QString);
Может, трубы спасут отца гусской демократии?
http://stackoverflow.com/questions/5911147/how-to-redirect-printf-output-back-into-code