qdebug重定向到文件就很简单了,度娘一大把,不献丑了。
然后想把qdebug打印到ui的textedit上,却没找到好文章,经过测试特分享。
说白了,因为qdebug定向时用到了全局函数,那么textedit作为一个类的成员,问题就变成了如何在全局函数访问类成员。
废话少说,看代码:
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); static MainWindow *m_mainWin; static void setText(QString str); private: Ui::MainWindow *ui; }; #endif // MAINWINDOW_H
#include "mainwindow.h" #include "ui_mainwindow.h" #include <qapplication.h> #include <QDateTime> #include <QFile> #include <QTextStream> #include <QtMsgHandler> #include <QMessageLogContext> #include <QMutex> void myMsgOutput(QtMsgType type, const QMessageLogContext &context, const QString& msg); MainWindow *MainWindow::m_mainWin = nullptr; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); m_mainWin = this; qInstallMessageHandler(myMsgOutput); } MainWindow::~MainWindow() { delete ui; } void MainWindow::setText(QString str) { m_mainWin->ui->textEdit->append(str); } void myMsgOutput(QtMsgType type, const QMessageLogContext &context, const QString& msg) { static QMutex mutex; Q_UNUSED(type); Q_UNUSED(context); mutex.lock(); #if 0 QString time=QDateTime::currentDateTime().toString(QString("[ yyyy-MM-dd HH:mm:ss:zzz ]")); QString mmsg; switch(type) { case QtDebugMsg: mmsg=QString("%1: Debug:\t%2 (file:%3, line:%4, func: %5)").arg(time).arg(msg).arg(QString(context.file)).arg(context.line).arg(QString(context.function)); break; case QtInfoMsg: mmsg=QString("%1: Info:\t%2 (file:%3, line:%4, func: %5)").arg(time).arg(msg).arg(QString(context.file)).arg(context.line).arg(QString(context.function)); break; case QtWarningMsg: mmsg=QString("%1: Warning:\t%2 (file:%3, line:%4, func: %5)").arg(time).arg(msg).arg(QString(context.file)).arg(context.line).arg(QString(context.function)); break; case QtCriticalMsg: mmsg=QString("%1: Critical:\t%2 (file:%3, line:%4, func: %5)").arg(time).arg(msg).arg(QString(context.file)).arg(context.line).arg(QString(context.function)); break; case QtFatalMsg: mmsg=QString("%1: Fatal:\t%2 (file:%3, line:%4, func: %5)").arg(time).arg(msg).arg(QString(context.file)).arg(context.line).arg(QString(context.function)); abort(); } /*QFile file("debug.txt"); file.open(QIODevice::ReadWrite | QIODevice::Append); QTextStream stream(&file); stream << mmsg << "\r\n"; file.flush(); file.close();*/ #endif MainWindow::setText(msg); mutex.unlock(); }
最后,在pro加上:DEFINES += QT_MESSAGELOGCONTEXT
============================
上面代码有点问题,因为在全局函数调用了setText这个静态函数,而它里面有ui操作,所以会可能崩溃。方法有2个:
1、建立一个signal/slot,使得在slot中更新text
2、使用QMetaObject::invokeMethod(MainWindow::instance(),"setStdout",Qt::QueuedConnection,Q_ARG(QString ,msg));调用slot函数setStdout