重定向qDebug、qWarning等到某个Qt窗口部件

来源:互联网 发布:kali linux卸载输入法 编辑:程序博客网 时间:2024/06/05 18:46

起源

看到 QtDev wiki 中有一篇文章QDebug 输出的浏览窗口。实现了将qDebug、qWarning等输出显示到一个窗口部件(QTextBrowser)中。

看完后,个人似乎对这堆代码不太感冒,于是自己试着写写,有了下面的代码:

实现了什么?

  • 定义了一个 MsgHandlerWapper 的类

  • qDebug、qWarning 等的输出会通过该类的 message 信号发送出来
  • 如果想让某个窗口接收消息,只需要定义一个槽,然后连接到该信号。

使用举例

如果要使用一个QPlainTextEdit作为log窗口,你只需要

  • 简单定义一个槽
  • connect到MsgHandlerWapper实例的信号即可

#include <QPlainTextEdit>#include "msghandlerwapper.h"class TextEdit:public QPlainTextEdit{    Q_OBJECTpublic:    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);    }};

代码

  • msghandlerwapper.h

/*  (C) 2011 dbzhang800#gmail.com*/#ifndef MSGHANDLERWAPPER_H#define MSGHANDLERWAPPER_H#include <QtCore/QObject>class MsgHandlerWapper:public QObject{    Q_OBJECTpublic:    static MsgHandlerWapper * instance();signals:    void message(QtMsgType type, const QString &msg);private:    MsgHandlerWapper();    static MsgHandlerWapper * m_instance;};#endif // MSGHANDLERWAPPER_Hs
  • msghandlerwapper.cpp

/*  (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);}

参考

  • http://developer.qt.nokia.com/wiki/Browser_for_QDebug_output

  • http://blog.csdn.net/dbzhang800/article/details/6449874


原创粉丝点击