Название: Перехват 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
Код
Название: Re: Перехват stdout Отправлено: qate от Май 04, 2017, 16:27 тоже через rdbuf делал, но както потом из потоков писанина вешалась
не стал разбираться, убрал такие поделки хотя может оно и будет работать, но мне и в консоле все видно хорошо, а там еще и цветом подсветка есть (на венде может и нету) Название: Re: Перехват stdout Отправлено: vic57 от Май 04, 2017, 17:18 Используются классы, которые пишут в stdout, и переделывать их нежелательно. можно через pipeКод
Название: 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 |