I wrote my own function for this problem, for QTextEdit, just keep in mind that if you run it with heavy operations along the main thread, your GUI will freeze. Thus, you need to create an instance of a new QThread, for example, a GUI, accordingly, QTextEdit will be updated accordingly:
Header file:
class myConsoleStream : public std::basic_streambuf<char> { public: myConsoleStream(std::ostream &stream, QTextEdit* text_edit); virtual ~myConsoleStream(); static void registerMyConsoleMessageHandler(); private: static void myConsoleMessageHandler(QtMsgType type, const QMessageLogContext &, const QString &msg); protected:
.cpp file:
myConsoleStream::myConsoleStream(std::ostream &stream, QTextEdit* text_edit) :std::basic_streambuf<char>() ,m_stream(stream) { this->log_window = text_edit; this->m_old_buf = stream.rdbuf(); stream.rdbuf(this); } myConsoleStream::~myConsoleStream() { this->m_stream.rdbuf(this->m_old_buf); } void myConsoleStream::registerMyConsoleMessageHandler() { qInstallMessageHandler(myConsoleMessageHandler); } void myConsoleStream::myConsoleMessageHandler(QtMsgType type, const QMessageLogContext &, const QString &msg) { QByteArray localMsg = msg.toLocal8Bit(); switch (type) { case QtDebugMsg: // fprintf(stderr, "Debug: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); break; case QtInfoMsg: // fprintf(stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); break; case QtWarningMsg: // fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); break; case QtCriticalMsg: //fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); break; case QtFatalMsg: // fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); break; default: std::cout << msg.toStdString().c_str(); break; } }
In your main window, you just need to instantiate a new thread:
new myConsoleStream(std::cout, this->ui->Console); myConsoleStream::registerMyConsoleMessageHandler();
and you are good too! Hope this helps.