• 活生生的例子: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里要用到。

  • 相关阅读:
    第一个自己独立开发并发布的软件
    第一个JavaWeb项目体验
    今天开博
    Mongoid Paging and Iterating Over Large Collections
    图片格式瞎扯淡
    是时候用Coffeescript了
    Mac 小技巧
    印度见闻札记
    作为开发人员,您应该尊重默认行为
    Java 注解(Annoation)学习笔记
  • 原文地址:https://www.cnblogs.com/findumars/p/5701998.html
Copyright © 2020-2023  润新知