zoukankan      html  css  js  c++  java
  • 制作Qt应用程序的插件(使用QtPlugin),对比DLL它是全平台通用的

    在Qt下,插件有两种形式,一种是用于QtCreator下,扩展IDE功能。另一种是用于扩展开发者的应用。本文要讲的是后者。

    定义一个纯虚类作为插件接口

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. #include <QtPlugin>  
    2. #include <QString>  
    3.   
    4. class IMyPlugin  
    5. {  
    6. public:  
    7.     virtual QString Hello() = 0;  
    8. };  
    9.   
    10. Q_DECLARE_INTERFACE(IMyPlugin, "com.apple.im.plugin.IMyPlugin")  

    最后一行的Q_DECLARE_INTERFACE宏告诉Qt这个纯虚类是一个插件接口。
    第一个参数是接口类名,第二个参数是插件标识符,标识符是大小写敏感的且必须是唯一的。

    接着就是接口的具体实现了

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. class MyPlugin : public QObject, public IMyPlugin  
    2. {  
    3.     Q_OBJEC  
    4.     Q_PLUGIN_METADATA(IID "com.google.myplugin" FILE "C:/a.json")  
    5.     Q_INTERFACES(IMyPlugin)  
    6. public:  
    7.     virtual QString Hello() Q_DECL_OVERRIDE;  
    8. };  

    实现类必须继承自QObject和插件接口类。Q_PLUGIN_METADATA宏用于描述插件元数据,第一个参数IID是必须的,同插件标识一样
    而第二个参数FILE是可选的,指定一个本地json文件,该文件中可以描述插件的相关数据信息
    (上面代码中指向的a.json内容为{"name":"jack", "age":18},稍后可以看到)

    测试方法的实现没啥好说了,只是返回一个字符串

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. QString MyPlugin::Hello()  
    2. {  
    3.     return "Hello";  
    4. }  


    调用的话也比较简单,就是通过QPluginLoader类

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. {  
    2.     QPluginLoader loader("C:/MyPlugin.dll");  
    3.     if (loader.load())  
    4.     {  
    5.         QObject *obj = loader.instance();  
    6.         if (obj)  
    7.         {  
    8.             IMyPlugin *plugin = qobject_cast<IMyPlugin*>(obj);  
    9.             if (plugin)  
    10.             {  
    11.                 // 测试插件方法  
    12.                 qDebug() << plugin->Hello();  
    13.   
    14.                 // 输出插件元数据  
    15.                 qDebug() << loader.metaData();  
    16.             }  
    17.   
    18.             // 需要手动释放  
    19.             delete obj;  
    20.         }  
    21.     }  
    22. }  

    最后运行结果如图


     

    http://blog.csdn.net/aqtata/article/details/38986271

  • 相关阅读:
    (转)批量导出存储过程
    (转)ylbtech-cnblogs(博客园)-数据库设计-6.0-Msg(短消息)
    (转)怎样玩转千万级别的数据
    (转)处理上百万条的数据库如何提高处理查询速度
    (转)SQLSERVER表分区的介绍(二)
    (转)SQLSERVER表分区的介绍(一)
    (转)在SQL中取出字符串中数字部分或在SQL中取出字符部分
    (转)SQL按照日、周、月、年统计数据
    构建操作mysql的类
    解决Celery 在Windows中搭建和使用的版本
  • 原文地址:https://www.cnblogs.com/findumars/p/6375655.html
Copyright © 2011-2022 走看看