1,定义接口文件

 /******************************************************************************************************
* Copyright (C) 2014, All right reserved. * file Basic_Module_Interface.h
* version 1.0
* author NingJian (freegodly@gmail.com)
* brief * detail
平台插件接口文件
* TODO
* history 2014-9-17 created by NingJian
*
* note
******************************************************************************************************/ #ifndef BASIC_MODULE_INTERFACE_H
#define BASIC_MODULE_INTERFACE_H #include <iostream>
#include <map>
#include <tr1/memory>
#include <tr1/functional>
#include <QScriptEngine>
#include <QScriptValue>
#include <QtCore/QtPlugin>
#include <QString> /* ############################################################################################################# */ ///
/// > 方便获取软件编译时间
///
#ifndef STT_BUILD_TIME
#define STT_BUILD_TIME std::string("Build Time: ")+std::string(__TIME__)+std::string(" ")+std::string(__DATE__)
#endif /* ############################################################################################################# */
///
/// > 定义测试结构信息
///
#ifndef STT_TEST_INFO
#define STT_TEST_INFO ///
/// \brief The TEST_INFO struct
///
struct TEST_INFO
{
///
/// \brief id [ID信息]
///
int id; std::string name;
///
/// \brief variable_map [测试结构的自定义数据存储]
///
std::map<std::string,std::string> variable_map; }; ///
/// \brief The TEST_FUN_INFO struct
///
struct TEST_FUN_INFO
{
std::string modle_name;
std::string fun_name;
std::string fun_describe;
}; #endif /* ############################################################################################################# */ ///
/// > 定义模块函数指针类型
///
#ifndef STT_FUN_REG
#define STT_FUN_REG ///
/// > 实现运行指令的函数类型 定义
///
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); ///
/// > 实现运行模块配置函数类型 定义
///
typedef bool (*UI_FUN)(); ///
/// > 实现注册模块配置函数 定义
///
typedef void (*REG_UI_FUN) (QString image_path,QString config_name ,UI_FUN f ); #endif /* ############################################################################################################# */ class IBasicModule
{
public:
virtual ~IBasicModule(){}
///
/// \brief initiation
/// 加载初始化资源等
///
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 =; ///
/// \brief initiation
/// 加载释放资源等
///
virtual bool release()const =; ///
/// \brief initiation
/// 测试前的初始化资源等
///
virtual bool initiation(int test_id)const =; ///
/// \brief initiation
/// 测试后的释放资源等
///
virtual bool finish(int test_id)const =; ///
/// \brief reg_fun
/// 注册命令的函数 需要实现要注册到平台的指令
/// 保存STT平台传来的函数和结构信息供该类以后调用
///
/// \param rf
/// 注册指令的平台回调函数指针
/// 如果模块有自定义数据导入,需要向test_info中添加数据
///
virtual void reg_fun(int test_id,QScriptEngine *eng ) const = ; virtual void reg_ui_fun(REG_UI_FUN reg_ui_f)const = ; ///
/// \brief get_moudle_version
/// 获取模块的版本信息
/// \return
///
virtual std::string get_moudle_version() const =; ///
/// \brief get_moudle_name
/// \return
///
virtual std::string get_moudle_name() const =; ///
/// \brief get_moudle_describe
/// 获取模块的描述信息
/// \return
///
virtual std::string get_moudle_describe() const =; }; QT_BEGIN_NAMESPACE #define IBasicModule_iid "com.twsz.tc.ningjian.IBasicModule/1.0" Q_DECLARE_INTERFACE(IBasicModule, IBasicModule_iid) QT_END_NAMESPACE //Q_DECLARE_INTERFACE(IBasicModule,"com.twsz.tc.ningjian.IBasicModule/1.0"); #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
 
 /******************************************************************************************************
* Copyright (C) 2014, All right reserved. * file
* version 1.0
* author NingJian (freegodly@gmail.com)
* brief * detail * TODO
* history 2014-9-17 created by NingJian
*
* note
******************************************************************************************************/
#ifndef STT_BASIC_MOUDLE_H
#define STT_BASIC_MOUDLE_H #include <Basic_Module_Interface.h>
#include <iostream>
#include <QScriptEngine>
#include <QScriptValue>
#include <QtCore/QtPlugin> #include <iostream>
using namespace std; class STT_Basic_Moudle:public QObject,public IBasicModule
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "com.twsz.tc.ningjian.IBasicModule/1.0" )
Q_INTERFACES(IBasicModule) public:
STT_Basic_Moudle();
// IBasicModule interface
public:
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;
bool release() const;
bool initiation(int test_id) const;
bool finish(int test_id) const; std::string get_moudle_version() const;
std::string get_moudle_describe() const;
void reg_fun(int test_id, QScriptEngine *eng) const;
void reg_ui_fun(REG_UI_FUN reg_ui_f) const;
std::string get_moudle_name() const; public:
///
/// \brief G_Test_Info
///
static std::map<int,TEST_INFO> *STT_G_Test_Info; ///
/// \brief G_Test_Fun_Info
///
static std::map<std::string,TEST_FUN_INFO> *STT_G_Test_Fun_Info; ///
/// \brief G_Test_Run_Fun
///
static RUN_FUN STT_G_Test_Run_Fun; ///
/// \brief STT_G_Moudles_Config
///
static std::map<std::string,std::string> *STT_G_Moudles_Config; }; std::string get_stt_variable(int test_id,std::string key);
void set_stt_variable(int test_id,std::string key,std::string value);
void add_fun(const char * moudle_name,const char * fun_name ,const char * fun_describe); #endif // STT_BASIC_MOUDLE_H
3、使用插件

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

												

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

  1. Qt之自定义插件(for Qt Designer)

    之前Blog里面有关于QWT的编译.配置.使用的文章,分别是在VS与Creator下进行的. QWT编译.配置.使用(VS2010 + Qt5.1.0). QWT编译.配置.使用(Qt Creator ...

  2. 使用Qt编写模块化插件式应用程序

    动态链接库技术使软件工程师们兽血沸腾,它使得应用系统(程序)可以以二进制模块的形式灵活地组建起来.比起源码级别的模块化,二进制级别的模块划分使得各模块更加独立,各模块可以分别编译和链接,模块的升级不会 ...

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

    Qt程序的文字编码,是通过插件来解决的,所以我们发布的时候需要把相应的插件也发布出去,在开发者电脑上程序会自动从插件目录加载到插件,但是如果发布给别的电脑使用,需要手动指定插件路径,如下所示: int ...

  4. 支付宝小程序自定义弹窗插件|支付宝dialog插件|model插件

    支付宝小程序自定义弹窗组件wcPop|小程序自定义对话框|actionSheet弹窗模板 支付宝小程序官方提供的alert提示框.dialog对话框.model弹窗功能比较有限,有些都不能随意自定义修 ...

  5. Qt自定义插件编程小结

    qt自定义组件开发步骤演示.以下所有步骤的前提是自己先编译Qtcreator源码,最好生成release版的QtCreator,否则自定义的插件嵌入QtCreator会失败!!!(这个网上教程很多) ...

  6. [Qt插件]-03创建Qt Designer自定义部件

    如何创建自定义部件并添加到Qt Designer来爽快的拖动部件可视化界面设计?   Qt Designer基于插件的架构使得它可以使用用户设计或者第三方提供的自定义部件,就像使用标准的Qt部件一样. ...

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

    微信小程序自定义组件弹窗wcPop|小程序消息提示框|toast自定义模板弹窗 平时在开发小程序的时候,弹窗应用场景还是蛮广泛的,但是微信官方提供的弹窗比较有局限性,不能自定义修改.这个时候首先想到的 ...

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

    在Qt下,插件有两种形式,一种是用于QtCreator下,扩展IDE功能.另一种是用于扩展开发者的应用.本文要讲的是后者. 定义一个纯虚类作为插件接口 #include <QtPlugin> ...

  9. VS2010 win7 QT4.8.0,实现VS2010编译调试Qt程序,QtCreator静态发布程序

    下载源代码,注意一定是源码压缩包如qt-everywhere-opensource-src-4.8.0.zip, 不是Qt发布的已编译的不同版本的标准库如qt-win-opensource-4.8.0 ...

随机推荐

  1. Android 5.x新特性之elevation(阴影),tinting(着色)以及clipping(剪裁)

    快过年了,公司也没事做了, 自己也闲了下来,一天天呆着真没意思,闲来没事自己研究研究了Google I/O 2014 发布 Material Design设计,人性化的风格,丰富的色彩,使人机交互更完 ...

  2. 如何使用picasso 对Android图片下载缓存

    相比较其他,picasso的图片缓存更加简单一些,他只需要一行代码就可以表述:导入相关jar包 Picasso.with(context).load("图片路径").into(Im ...

  3. ThinkPHP 3 的输出

    一.ThinkPHP 3 的输出 (重点) a.通过 echo 等PHP原生的输出方式在页面中输出 b.通过display方法输出 想分配变量可以使用assign方法 c.修改左右定界符 休要修改配置 ...

  4. [置顶] ※数据结构※→☆线性表结构(list)☆============单向链表结构(list single)(二)

    单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始:链表是使用指针进行构造的列表:又称为结点列表,因为链表是由一个个结点组装起来的:其中每个结点都有指 ...

  5. window.open 使用方法

    window.open(url,name,features,replace); //parameters 解释: URL:需要打开的URL Name:打开URL的标题 Feature:控制窗口大小的参 ...

  6. .NET WIN7+IIS 7.5下URLRewriter组件伪静态设置

    原文地址:WIN7+IIS 7.5伪静态的设置 --------------------------------------------------------偶是分割线君-------------- ...

  7. The Painter's Partition Problem Part II

    (http://leetcode.com/2011/04/the-painters-partition-problem-part-ii.html) This is Part II of the art ...

  8. 两种mysql文件安装方式——win7 32位OS

    官网给出的安装包有两种格式,一个是msi格式,一个是zip格式的. 1. .ZIP格式安装 http://jingyan.baidu.com/article/f3ad7d0ffc061a09c3345 ...

  9. USACO Seciton 5.4 Canada Tour(dp)

    因为dp(i,j)=dp(j,i),所以令i>j. dp(i,j)=max(dp(k,j))+1(0<=k<i),若此时dp(i,j)=1则让dp(i,j)=0.(因为无法到达此状态 ...

  10. 微信公众号token验证失败的一些总结

    这几天准备弄一个微信公众号,在进行服务器配置的时候出现总是出现token验证失败的报错. 实际上,这个问题很好解决.既然微信平台没有给我们很明确的报错提示,那么我们就可以通过跟踪获取到的请求参数进行分 ...