Qt 插件总结

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,466评论 25 708
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,970评论 2 59
  • 我上月下旬一回到大理,先生就递给我一封尚未拆开的信,并说是特意等我回来亲手拆的。 这是一封从邮局寄来的挂号信,沉甸...
    万春英阅读 776评论 0 0
  • 因为不是你,所以谁找我都不想理 因为是你,而你不理我,我只能偷偷想你
    蜗牛馒馒阅读 156评论 0 0
  • 六月的北关下了一场雨 我撑着伞走过漆水河上的桥 河边那不知名的树 流露出彷徨 我们是不是在哪儿见过 在你转身的一瞬...
    秋天若风阅读 240评论 0 0