zoukankan      html  css  js  c++  java
  • Qt 插件化编程

    Qt插件机制

    1、通过插件扩展应用程序功能
    A、定义一个接口集(只有纯虚函数的类),用来与插件交流。
    B、用宏Q_DECLARE_INTERFACE()将该接口告诉Qt元对象系统。
    C、应用程序中用QPluginLoader来加载插件。
    D、用宏qobject_cast()来判断一个插件是否实现了接口。

    2、创建插件
    A、声明插件类,插件类继承自QObject和插件实现的接口。
    B、用宏Q_INTERFACES()将插件接口告诉Qt元对象系统。(注意Qt版本)
    C、用宏Q_EXPORT_PLUGIN2()导出插件类。(注意Qt版本)
    D、用适当的.pro文件构建插件。
    注:在加载插件前,QCoreApplication对象必须被初始化。

    Qt插件类创建

     1 ////step 1 定义接口类
     2 class RegExpInterface
     3 {
     4 public:
     5     virtual ~RegExpInterface() {}
     6     virtual QString regexp(const QString &message) = 0;
     7 };
     8 ////step 2 声明是接口类(接口类中)
     9 // 使用 Q_DECLARE_INTERFACE 宏,是为了让Qt元对象系统知道该接口,这样以来,在运行时便可以识别实现接口的插件。
    10 // Q_DECLARE_INTERFACE(接口类名, 接口标识),第二个参数(RegExpInterface_iid)是一个标识接口的字符串,必须唯一。
    11 #define RegExpInterface_iid "org.qter.Examples.myplugin.RegExpInterface"
    12 Q_DECLARE_INTERFACE(RegExpInterface,RegExpInterface_iid )
    13 #endif // REGEXPINTERFACE_H
    14 ////step 3 实现接口
    15 class REGEXPLUGINSHARED_EXPORT RegexPlugin : public QObject,RegExpInterface
    16 {
    17     Q_OBJECT
    18     //Q_PLUGIN_METADATA宏用于描述插件元数据,第一个参数为插件的 IID,与接口定义的IID相同
    19     //第二个参数FILE是可选的,指定一个本地json文件,该文件中描述插件的相关数据信息
    20     Q_PLUGIN_METADATA(IID RegExpInterface_iid FILE "regexplugindata.json")
    21     //Q_INTERFACES 宏用于告诉 Qt 该类实现的接口。
    22     Q_INTERFACES(RegExpInterface)
    23 public:
    24     RegexPlugin();
    25     // RegExpInterface interface
    26 public:
    27     QString regexp(const QString &message);
    28 };
    29 ////step 4 使用接口
    30 // 进入插件目录
    31 QDir pluginsDir(qApp->applicationDirPath());
    32 pluginsDir.cd("bin");
    33 // 遍历插件目录
    34 foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {
    35     QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
    36     QObject *plugin = pluginLoader.instance();
    37     if (plugin) {
    38         //取回json文件的内容
    39         QJsonObject w = pluginLoader.metaData().value("MetaData").toObject();
    40         qDebug()<<w;
    41         regexpInterface = qobject_cast<RegExpInterface *>(plugin);
    42         if (regexpInterface)
    43             return true;
    44     }
    45 }
    博客园文作者:Citrusliu 博文地址:https://www.cnblogs.com/citrus
  • 相关阅读:
    DOM和XMLHttpRequest对象的属性和方法
    【代码版】今天,你的密码泄露了吗?
    使用Smarty的相关注意事项及访问变量的几种方式
    HttpWatch工具简介及使用技巧
    Smarty中的请求变量和保留变量的使用范例
    Linux管道操作
    发布mvc3报错:403.14Forbidden Web 服务器被配置为不列出此目录的内容
    仿Linux中的cp操作
    Fedora的ifconfig命令
    @ Register和@ Reference的区别
  • 原文地址:https://www.cnblogs.com/citrus/p/15770469.html
Copyright © 2011-2022 走看看