QT 程序自定义插件

1,定义接口文件

  1 /******************************************************************************************************
  2 * Copyright (C) 2014, All right reserved.
  3
  4 * file   Basic_Module_Interface.h
  5 * version  1.0
  6 * author   NingJian ([email protected])
  7 * brief
  8
  9 * detail
 10       平台插件接口文件
 11 * TODO
 12 * history  2014-9-17 created by NingJian
 13 *
 14 * note
 15 ******************************************************************************************************/
 16
 17 #ifndef BASIC_MODULE_INTERFACE_H
 18 #define BASIC_MODULE_INTERFACE_H
 19
 20
 21 #include <iostream>
 22 #include <map>
 23 #include <tr1/memory>
 24 #include <tr1/functional>
 25 #include <QScriptEngine>
 26 #include <QScriptValue>
 27 #include <QtCore/QtPlugin>
 28 #include <QString>
 29
 30
 31 /* ############################################################################################################# */
 32
 33 ///
 34 ///  > 方便获取软件编译时间
 35 ///
 36 #ifndef  STT_BUILD_TIME
 37 #define STT_BUILD_TIME std::string("Build Time: ")+std::string(__TIME__)+std::string(" ")+std::string(__DATE__)
 38 #endif
 39
 40 /* ############################################################################################################# */
 41 ///
 42 ///  > 定义测试结构信息
 43 ///
 44 #ifndef STT_TEST_INFO
 45 #define STT_TEST_INFO
 46
 47 ///
 48 /// \brief The TEST_INFO struct
 49 ///
 50 struct TEST_INFO
 51 {
 52     ///
 53     /// \brief id [ID信息]
 54     ///
 55     int id;
 56
 57     std::string name;
 58     ///
 59     /// \brief variable_map  [测试结构的自定义数据存储]
 60     ///
 61     std::map<std::string,std::string> variable_map;
 62
 63 };
 64
 65 ///
 66 /// \brief The TEST_FUN_INFO struct
 67 ///
 68 struct TEST_FUN_INFO
 69 {
 70     std::string modle_name;
 71     std::string fun_name;
 72     std::string fun_describe;
 73 };
 74
 75
 76 #endif
 77
 78 /* ############################################################################################################# */
 79
 80 ///
 81 ///  > 定义模块函数指针类型
 82 ///
 83 #ifndef STT_FUN_REG
 84 #define STT_FUN_REG
 85
 86
 87 ///
 88 ///   > 实现运行指令的函数类型 定义
 89 ///
 90 typedef bool (*RUN_FUN)(QString fun_name, int test_id,QString arg1 ,QString arg2,QString arg3,QString arg4, QString arg5,QString arg6,QString arg7,QString arg8,QString arg9);
 91
 92 ///
 93 ///   > 实现运行模块配置函数类型 定义
 94 ///
 95 typedef bool (*UI_FUN)();
 96
 97 ///
 98 ///   > 实现注册模块配置函数 定义
 99 ///
100 typedef  void (*REG_UI_FUN) (QString image_path,QString config_name ,UI_FUN f );
101
102
103 #endif
104
105 /* ############################################################################################################# */
106
107 class IBasicModule
108 {
109 public:
110     virtual ~IBasicModule(){}
111     ///
112     /// \brief initiation
113     /// 加载初始化资源等
114     ///
115         virtual bool init(std::map<int,TEST_INFO> &test_info,std::map<std::string,TEST_FUN_INFO> &test_fun_info,std::map<std::string,std::string>  &moudles_config,RUN_FUN run_fun)const =0;
116
117     ///
118     /// \brief initiation
119     /// 加载释放资源等
120     ///
121     virtual bool release()const =0;
122
123
124     ///
125     /// \brief initiation
126     /// 测试前的初始化资源等
127     ///
128     virtual bool initiation(int test_id)const =0;
129
130     ///
131     /// \brief initiation
132     /// 测试后的释放资源等
133     ///
134     virtual bool finish(int test_id)const =0;
135
136     ///
137     /// \brief reg_fun
138     ///  注册命令的函数 需要实现要注册到平台的指令
139     ///  保存STT平台传来的函数和结构信息供该类以后调用
140     ///
141     /// \param rf
142     /// 注册指令的平台回调函数指针
143     /// 如果模块有自定义数据导入,需要向test_info中添加数据
144     ///
145     virtual void reg_fun(int test_id,QScriptEngine *eng ) const = 0;
146
147
148     virtual void reg_ui_fun(REG_UI_FUN reg_ui_f)const = 0;
149
150     ///
151     /// \brief get_moudle_version
152     /// 获取模块的版本信息
153     /// \return
154     ///
155     virtual  std::string get_moudle_version() const =0;
156
157     ///
158     /// \brief get_moudle_name
159     /// \return
160     ///
161     virtual  std::string get_moudle_name() const =0;
162
163     ///
164     /// \brief get_moudle_describe
165     /// 获取模块的描述信息
166     /// \return
167     ///
168     virtual  std::string get_moudle_describe() const =0;
169
170
171 };
172
173
174 QT_BEGIN_NAMESPACE
175
176 #define IBasicModule_iid "com.twsz.tc.ningjian.IBasicModule/1.0"
177
178 Q_DECLARE_INTERFACE(IBasicModule, IBasicModule_iid)
179
180 QT_END_NAMESPACE
181
182
183 //Q_DECLARE_INTERFACE(IBasicModule,"com.twsz.tc.ningjian.IBasicModule/1.0");
184
185 #endif // BASIC_MODULE_INTERFACE_H

基本是纯虚类要在末尾添加

Q_DECLARE_INTERFACE(IBasicModule, IBasicModule_iid) 即可

2、实现插件头文件 如下:  cpp正常就好了,注意要继承QObject 和 接口类就可以了,还要在在头文件中添加
    Q_OBJECT
    Q_PLUGIN_METADATA(IID "com.twsz.tc.ningjian.IBasicModule/1.0" )
    Q_INTERFACES(IBasicModule)在项目属性中要添加
TEMPLATE = lib
CONFIG += plugin
 

 1 /******************************************************************************************************
 2 * Copyright (C) 2014, All right reserved.
 3
 4 * file
 5 * version  1.0
 6 * author   NingJian ([email protected])
 7 * brief
 8
 9 * detail
10
11 * TODO
12 * history  2014-9-17 created by NingJian
13 *
14 * note
15 ******************************************************************************************************/
16 #ifndef STT_BASIC_MOUDLE_H
17 #define STT_BASIC_MOUDLE_H
18
19
20 #include <Basic_Module_Interface.h>
21 #include <iostream>
22 #include <QScriptEngine>
23 #include <QScriptValue>
24 #include <QtCore/QtPlugin>
25
26 #include <iostream>
27 using namespace std;
28
29 class  STT_Basic_Moudle:public QObject,public IBasicModule
30 {
31     Q_OBJECT
32     Q_PLUGIN_METADATA(IID "com.twsz.tc.ningjian.IBasicModule/1.0" )
33     Q_INTERFACES(IBasicModule)
34
35
36 public:
37     STT_Basic_Moudle();
38     // IBasicModule interface
39 public:
40     bool init(std::map<int, TEST_INFO> &test_info, std::map<string, TEST_FUN_INFO> &test_fun_info, std::map<string, string> &moudles_config, RUN_FUN run_fun) const;
41     bool release() const;
42     bool initiation(int test_id) const;
43     bool finish(int test_id) const;
44
45     std::string get_moudle_version() const;
46     std::string get_moudle_describe() const;
47     void reg_fun(int test_id, QScriptEngine *eng) const;
48     void reg_ui_fun(REG_UI_FUN reg_ui_f) const;
49     std::string get_moudle_name() const;
50
51
52
53 public:
54     ///
55     /// \brief G_Test_Info
56     ///
57     static std::map<int,TEST_INFO> *STT_G_Test_Info;
58
59     ///
60     /// \brief G_Test_Fun_Info
61     ///
62     static std::map<std::string,TEST_FUN_INFO>  *STT_G_Test_Fun_Info;
63
64
65     ///
66     /// \brief G_Test_Run_Fun
67     ///
68     static RUN_FUN STT_G_Test_Run_Fun;
69
70     ///
71     /// \brief STT_G_Moudles_Config
72     ///
73     static std::map<std::string,std::string>  *STT_G_Moudles_Config;
74
75
76 };
77
78
79 std::string get_stt_variable(int test_id,std::string key);
80 void set_stt_variable(int test_id,std::string key,std::string value);
81 void add_fun(const char * moudle_name,const char * fun_name ,const char * fun_describe);
82
83
84 #endif // STT_BASIC_MOUDLE_H

3、使用插件

下面是遍历加载plugins目录下所有实现 IBasicModule 接口的插件 获取相应的实例就可以调用了头文件记得添加
#include <QPluginLoader>
 1     //注册模块指令
 2     QDir plugindir = QDir(QDir::currentPath()+"/plugins");
 3     int i = 0;
 4     foreach(QString filename,plugindir.entryList(QDir::Files)){
 5         QPluginLoader loader(plugindir.absoluteFilePath(filename));
 6         if (IBasicModule * base_moudle = qobject_cast<IBasicModule *>(loader.instance()))
 7         {
 8             qDebug()<<base_moudle->get_moudle_name().c_str();
 9
10             STT_Global::basicModule_map.insert(std::pair<std::string,IBasicModule*>(base_moudle->get_moudle_name(),base_moudle));
11             STT_Global::PlugsList.push_back( base_moudle->get_moudle_name());
12             base_moudle->init(G_Test_Info,G_Test_Fun_Info,G_Moudles_Config,G_STT_Run_Fun);
13             base_moudle->reg_fun(-1,G_STT_Interpreter[-1]);
14             base_moudle->reg_ui_fun(G_Reg_UI_FUN);
15             i++;
16             emit STT_Global::fl->signal_process(20+ 80 * i / plugindir.entryList(QDir::Files).size());
17         }
18     }

				
时间: 2024-07-30 10:42:40

QT 程序自定义插件的相关文章

解决Qt程序发布时中文乱码问题(通过QApplication.addLibraryPath加载QTextCodec插件)

Qt程序的文字编码,是通过插件来解决的,所以我们发布的时候需要把相应的插件也发布出去,在开发者电脑上程序会自动从插件目录加载到插件,但是如果发布给别的电脑使用,需要手动指定插件路径,如下所示: int main(int argc, char *argv[]) { QApplication a(argc, argv); QString strLibPath = a.applicationDirPath(); strLibPath += "/plugins"; //plugins就是插件目

制作Qt应用程序的插件(使用QtPlugin),对比DLL它是全平台通用的

在Qt下,插件有两种形式,一种是用于QtCreator下,扩展IDE功能.另一种是用于扩展开发者的应用.本文要讲的是后者. 定义一个纯虚类作为插件接口 [cpp] view plain copy #include <QtPlugin> #include <QString> class IMyPlugin { public: virtual QString Hello() = 0; }; Q_DECLARE_INTERFACE(IMyPlugin, "com.apple.i

微信小程序自定义弹窗wcPop插件|仿微信弹窗样式

微信小程序自定义组件弹窗wcPop|小程序消息提示框|toast自定义模板弹窗 平时在开发小程序的时候,弹窗应用场景还是蛮广泛的,但是微信官方提供的弹窗比较有局限性,不能自定义修改.这个时候首先想到的是自定义组件化开发,就是把弹出框封装成一个组件,然后多处调用. 解决了小程序开发自定义弹窗出现后,遮罩层下的页面仍可以滚动的方法: 给遮罩层的最外层view中加入catchtouchmove="preventTouchMove" 即可解决该遮罩层点透问题. 根据需要还可以自定义多个按钮及事

亲测VS2010纯静态编译QT4.8.0,实现VS2010编译调试Qt程序,QtCreator静态发布程序(图文并茂,非常详细)

下载源代码,注意一定是源码压缩包如qt-everywhere-opensource-src-4.8.0.zip,不是Qt发布的已编译的不同版本的标准库如qt-win-opensource-4.8.0-vs2010.exe,这些版本都只是动态编译的,不是我们所需要的.只有用源码包才能做真正的纯静态编译,如果用Qt官网已编译的标准库.exe文件进行编译,有可能出现各种错误,而且编译后的文件巨大,我当时就在这里绕了很大的弯子,请童鞋们注意啦!!可能有些老鸟会笑话,但我本着最严肃的态度告诉菜鸟们,上网查

QSS美化Qt程序以及最近做的Qt项目界面

什么是QSS QSS称为Qt Style Sheets也就是Qt样式表,它是Qt提供的一种用来自定义控件外观的机制.QSS大量参考了CSS的内容,只不过QSS的功能比CSS要弱很多,体现在选择器要少,可以使用的QSS属性也要少很多,并且并不是所有的属性都可以用在Qt的所有控件上. QSS在Qt程序中的使用办法 首先将QSS写在文件中,然后利用如下的代码设置QSS: MainWidget::MainWidget(QWidget *parent) : QWidget(parent), ui(new

cordova3.X 运用grunt生成plugin自定义插件骨架

Cordova提供了一组设备相关的API,通过这组API,移动应用能够以JavaScript访问原生的设备功能,如摄像头.麦克风等.Cordova还提供了一组统一的JavaScript类库,以及为这些类库所用的设备相关的原生后台代码. 一.安装cordova npm install -g cordova 二.创建项目 cordova create hello com.blue.sky.hybrid.app.hello HelloWorld 三.添加平台支持 cd hello cordova pl

Windows如何打包Qt程序

很多Qt爱好者想发布自己的Qt软件,但却发现在其他没有安装Qt SDK的机器上无法运行,这就是本文想要说明的问题.现在网上大部分软件都要发布自己开发的应用程序,都会打包到exe文件中,待安装完exe文件后,就会生成很多小文件,其实原理都一样,只是各自使用的打包工具不能罢了.本文主要介绍在Windows平台如何打包自己的Qt程序,相对比较简单的,这并没有正规软件的向导流程. 在Windows系统中,要打包Qt程序,主要会用到3个工具包,分别是: 1.hap-depends    查看软件的依赖库(

基于vs2005以上版本Qt程序发布的注意事项(讲了manifest的问题)

最近发现了一个非常恼人的程序deployment的问题,估计大家有可能也会遇到,特此memo. 问题的出现我觉得主要还是微软搞的花头太多, 一个不知所谓的manifest文件让本来简单的程序发布变得困难重重. 找了找关于manifest的介绍,貌似这个文件是用来描述程序或者库的依赖关系, 特别是对程序依赖的版本进行描述, 这样系统可以通过manifest的内容找到正确的库版本. 理论上讲这个dd确实是不错, 可以解决版本不兼容的问题, 保证程序运行的时候用的是指定版本的库. 不过实际操作起来麻烦

BrnShop开源网上商城第四讲:自定义插件

重要通知:BrnShop企业版NOSQL设计(基于Redis)已经开源!源码内置于最新版的BrnShop中,感兴趣的园友可以去下载来看看.官网地址:www.brnshop.com. 好了现在进入今天的正题:自定义插件.上一讲中我们已经阐述了BrnShop插件的工作机制,现在我们详细介绍下如何自定义插件.首先BrnShop的插件从功能上分为三类,分别是: 开放授权插件(OAuth) 支付插件 配送插件 对应的接口文件(注:位于BrnShop.Core项目的Plugin/Base文件夹中)依次如下: