Я написал свою собственную функцию для этой проблемы, для QTextEdit, просто имейте в виду, что если вы запустите его с тяжелыми операциями вдоль основного потока, ваш графический интерфейс будет зависать.Так что вам нужно создать новый QThread, например, тогда графический интерфейс соответственно QTextEdit будет обновлен соответственно:
Заголовочный файл:
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:
// Diese Funktion wird aufgerufen wenn std::endl im Stream erscheint
virtual int_type overflow(int_type v)
{
if (v == '\n')
{
log_window->append("");
}
return v;
}
virtual std::streamsize xsputn(const char *p, std::streamsize n);
private:
std::ostream &m_stream;
std::streambuf *m_old_buf;
QTextEdit* log_window;
};
#endif // Q_DEBUGSTREAM_H
.cpp Файл:
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;
}
}
В вашем главном окне вы просто должны создать свой новый поток:
new myConsoleStream(std::cout, this->ui->Console);
myConsoleStream::registerMyConsoleMessageHandler();
и вы тоже хороши!Надеюсь, это поможет.