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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Перехват stdout  (Прочитано 7662 раз)
Иволга
Чайник
*
Offline Offline

Сообщений: 58



Просмотр профиля
« : Май 04, 2017, 11:48 »

Добрый день.

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

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Май 04, 2017, 11:52 »

Тут подсказали, что нужно сделать свою реализацию 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);
Записан

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

Сообщений: 1177


Просмотр профиля
« Ответ #2 : Май 04, 2017, 16:27 »

тоже через rdbuf делал, но както потом из потоков писанина вешалась
не стал разбираться, убрал такие поделки
хотя может оно и будет работать, но мне и в консоле все видно хорошо, а там еще и цветом подсветка есть (на венде может и нету)
Записан
vic57
Чайник
*
Offline Offline

Сообщений: 90


Просмотр профиля
« Ответ #3 : Май 04, 2017, 17:18 »

Используются классы, которые пишут в stdout, и переделывать их нежелательно.
можно через pipe
Код
Bash
proc1 | proc2
 
Записан
titan83
Гость
« Ответ #4 : Май 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
Записан
Иволга
Чайник
*
Offline Offline

Сообщений: 58



Просмотр профиля
« Ответ #5 : Май 05, 2017, 08:46 »

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

--> Я работаю с Qt 10 лет уже
Strong.
--> Поэтому добавлю emit logMessage(QString);
Может, трубы спасут отца гусской демократии?
http://stackoverflow.com/questions/5911147/how-to-redirect-printf-output-back-into-code
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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