起源看到 QtDev wiki 中有一篇文章QDebug 输出的浏览窗口。实现了将qDebug、qWarning等输出显示到一个窗口部件(QTextBrowser)中。 看完后,个人似乎对这堆代码不太感冒,于是自己试着写写,有了下面的代码: 实现了什么?
使用举例如果要使用一个QPlainTextEdit作为log窗口,你只需要
#include <QPlainTextEdit> #include "msghandlerwapper.h" class TextEdit:public QPlainTextEdit { Q_OBJECT public: explicit TextEdit(QWidget * parent = 0) :QPlainTextEdit(parent) { connect(MsgHandlerWapper::instance(), SIGNAL(message(QtMsgType,QString)), SLOT(outputMessage(QtMsgType,QString))); } public slots: void outputMessage(QtMsgType type, const QString &msg) { appendPlainText(msg); } }; 代码
/* (C) 2011 dbzhang800#gmail.com */ #ifndef MSGHANDLERWAPPER_H #define MSGHANDLERWAPPER_H #include <QtCore/QObject> class MsgHandlerWapper:public QObject { Q_OBJECT public: static MsgHandlerWapper * instance(); signals: void message(QtMsgType type, const QString &msg); private: MsgHandlerWapper(); static MsgHandlerWapper * m_instance; }; #endif // MSGHANDLERWAPPER_Hs
/* (C) 2011 dbzhang800#gmail.com */ #include "msgwapper.h" #include <QtCore/QMetaType> #include <QtCore/QMutex> #include <QtCore/QMutexLocker> #include <QtCore/QCoreApplication> void static msgHandlerFunction(QtMsgType type, const char *msg) { QMetaObject::invokeMethod(MsgHandlerWapper::instance(), "message" , Q_ARG(QtMsgType, type) , Q_ARG(QString, QString::fromLocal8Bit(msg))); } MsgHandlerWapper * MsgHandlerWapper::m_instance = 0; MsgHandlerWapper * MsgHandlerWapper::instance() { static QMutex mutex; if (!m_instance) { QMutexLocker locker(&mutex); if (!m_instance) m_instance = new MsgHandlerWapper; } return m_instance; } MsgHandlerWapper::MsgHandlerWapper() :QObject(qApp) { qRegisterMetaType<QtMsgType>("QtMsgType"); qInstallMsgHandler(msgHandlerFunction); } 参考 |
|