美文网首页
Qt 插件总结

Qt 插件总结

作者: 陆不凡 | 来源:发表于2018-09-30 21:44 被阅读0次

    1、 接口的定义

    //step 1 定义接口
    class RegExpInterface
    {
    public:
        virtual ~RegExpInterface() {}
        virtual QString regexp(const QString &message) = 0;
    };
    
    // step 2
    // 声明接口
    // 使用 Q_DECLARE_INTERFACE 宏,是为了让Qt元对象系统知道该接口,这样以来,在运行时便可以识别实现接口的插件。
    // Q_DECLARE_INTERFACE(接口类名, 接口标识),第二个参数(RegExpInterface_iid)是一个标识接口的字符串,必须唯一。
    
    #define RegExpInterface_iid "org.qter.Examples.myplugin.RegExpInterface"
    Q_DECLARE_INTERFACE(RegExpInterface,RegExpInterface_iid )
    #endif // REGEXPINTERFACE_H
    

    2、接口的实现

    //step 3  实现接口
    class REGEXPLUGINSHARED_EXPORT RegexPlugin : public QObject,RegExpInterface
    {
        Q_OBJECT
    
        //Q_PLUGIN_METADATA宏用于描述插件元数据,第一个参数为插件的 IID,与接口定义的IID相同
        //第二个参数FILE是可选的,指定一个本地json文件,该文件中可以描述插件的相关数据信息
        Q_PLUGIN_METADATA(IID RegExpInterface_iid FILE "regexplugindata.json")
    
        //Q_INTERFACES 宏用于告诉 Qt 该类实现的接口。
        Q_INTERFACES(RegExpInterface)
    public:
        RegexPlugin();
    
        // RegExpInterface interface
    public:
        QString regexp(const QString &message);
    };
    

    3、接口的使用

        // 进入插件目录
        QDir pluginsDir(qApp->applicationDirPath());
        pluginsDir.cd("bin");
        // 遍历插件目录
        foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {
            QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
            QObject *plugin = pluginLoader.instance();
            if (plugin) {
                //取回json文件的内容
                QJsonObject w = pluginLoader.metaData().value("MetaData").toObject();
                qDebug()<<w;
                regexpInterface = qobject_cast<RegExpInterface *>(plugin);
                if (regexpInterface)
                    return true;
            }
        }
        return false;
    

    源码链接
    https://download.csdn.net/download/u011370855/10698561

    相关文章

      网友评论

          本文标题:Qt 插件总结

          本文链接:https://www.haomeiwen.com/subject/eklgoftx.html