zoukankan      html  css  js  c++  java
  • 活生生的例子:qInstallMessageHandler接受指定类型的函数指针,这样就可以随心所欲的让程序员自定义函数名以及函数位置

    理论:qInstallMessageHandler是被定义在全局空间里:

    http://doc.qt.io/qt-5/qtglobal.html#QtMessageHandler-typedef

    实践:

    http://blog.csdn.net/liang19890820/article/details/51838379

    void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
    {
        // 加锁
        static QMutex mutex;
        mutex.lock();
    
        QByteArray localMsg = msg.toLocal8Bit();
    
        QString strMsg("");
        switch(type)
        {
        case QtDebugMsg:
            strMsg = QString("Debug:");
            break;
        case QtWarningMsg:
            strMsg = QString("Warning:");
            break;
        case QtCriticalMsg:
            strMsg = QString("Critical:");
            break;
        case QtFatalMsg:
            strMsg = QString("Fatal:");
            break;
        }
    
        // 设置输出信息格式
        QString strDateTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ddd");
        QString strMessage = QString("Message:%1 File:%2  Line:%3  Function:%4  DateTime:%5")
                .arg(localMsg.constData()).arg(context.file).arg(context.line).arg(context.function).arg(strDateTime);
    
        // 输出信息至文件中(读写、追加形式)
        QFile file("log.txt");
        file.open(QIODevice::ReadWrite | QIODevice::Append);
        QTextStream stream(&file);
        stream << strMessage << "
    ";
        file.flush();
        file.close();
    
        // 解锁
        mutex.unlock();
    }
    
    int main(int argc, char **argv)
    {
        QApplication app(argc, argv);
    
        // 安装消息处理程序
        qInstallMessageHandler(myMessageOutput);
    
        // 打印信息
        qDebug("This is a debug message.");
        qWarning("This is a warning message.");
        qCritical("This is a critical message.");
        qFatal("This is a fatal message.");
    
        ...
        return app.exec();
    }

    所以我可以自定义myMessageOutput函数,函数明明是随意指定的,却仍可以在整个QT框架中正确工作,靠的就是函数指针这个办法。

    以前就光知道这套理论,却不知道什么情况下应该应用它,现在算是明白了。而且这应该也是QT框架中常用的一种手法,比如还有QtFutur里要用到。

  • 相关阅读:
    MiscellaneosDatabase: 常用数据库资源。包含(Northwind+cn,pubs)
    创建和使用 XML Web 服务
    A.9 ASP.NET 中的验证控件(Validator)
    A.6什么是“asp.net”?
    A.12C# ADO.NET 数据库访问
    LINQ To SQL 的案例
    502 Bad Gateway
    常用 Dos 命令+杂项常用的命令符+常用的公式
    Linux 的 Clock skew detected. Your build may be incomplete 解决方法
    window下Linux 的安装和简单使用 & WMware Workstation 9.0中Linux(Red Hat) 的安装
  • 原文地址:https://www.cnblogs.com/findumars/p/5701998.html
Copyright © 2011-2022 走看看