Qt制作应用插件
2016-03-14 22:38
525 查看
在Qt下,插件有两种形式,一种是用于QtCreator下,扩展IDE功能。另一种是用于扩展开发者的应用。本文要讲的是后者。
定义一个纯虚类作为插件接口
[cpp] view plain copy
#include <QtPlugin>
#include <QString>
class IMyPlugin
{
public:
virtual QString Hello() = 0;
};
Q_DECLARE_INTERFACE(IMyPlugin, "com.apple.im.plugin.IMyPlugin")
最后一行的Q_DECLARE_INTERFACE宏告诉Qt这个纯虚类是一个插件接口。
第一个参数是接口类名,第二个参数是插件标识符,标识符是大小写敏感的且必须是唯一的。
接着就是接口的具体实现了
[cpp] view plain copy
class MyPlugin : public QObject, public IMyPlugin
{
Q_OBJEC
Q_PLUGIN_METADATA(IID "com.google.myplugin" FILE "C:/a.json")
Q_INTERFACES(IMyPlugin)
public:
virtual QString Hello() Q_DECL_OVERRIDE;
};
实现类必须继承自QObject和插件接口类。Q_PLUGIN_METADATA宏用于描述插件元数据,第一个参数IID是必须的,同插件标识一样
而第二个参数FILE是可选的,指定一个本地json文件,该文件中可以描述插件的相关数据信息
(上面代码中指向的a.json内容为{"name":"jack", "age":18},稍后可以看到)
测试方法的实现没啥好说了,只是返回一个字符串
[cpp] view plain copy
QString MyPlugin::Hello()
{
return "Hello";
}
调用的话也比较简单,就是通过QPluginLoader类
[cpp] view plain copy
{
QPluginLoader loader("C:/MyPlugin.dll");
if (loader.load())
{
QObject *obj = loader.instance();
if (obj)
{
IMyPlugin *plugin = qobject_cast<IMyPlugin*>(obj);
if (plugin)
{
// 测试插件方法
qDebug() << plugin->Hello();
// 输出插件元数据
qDebug() << loader.metaData();
}
// 需要手动释放
delete obj;
}
}
}
最后运行结果如图
/content/1526303.html
定义一个纯虚类作为插件接口
[cpp] view plain copy
#include <QtPlugin>
#include <QString>
class IMyPlugin
{
public:
virtual QString Hello() = 0;
};
Q_DECLARE_INTERFACE(IMyPlugin, "com.apple.im.plugin.IMyPlugin")
最后一行的Q_DECLARE_INTERFACE宏告诉Qt这个纯虚类是一个插件接口。
第一个参数是接口类名,第二个参数是插件标识符,标识符是大小写敏感的且必须是唯一的。
接着就是接口的具体实现了
[cpp] view plain copy
class MyPlugin : public QObject, public IMyPlugin
{
Q_OBJEC
Q_PLUGIN_METADATA(IID "com.google.myplugin" FILE "C:/a.json")
Q_INTERFACES(IMyPlugin)
public:
virtual QString Hello() Q_DECL_OVERRIDE;
};
实现类必须继承自QObject和插件接口类。Q_PLUGIN_METADATA宏用于描述插件元数据,第一个参数IID是必须的,同插件标识一样
而第二个参数FILE是可选的,指定一个本地json文件,该文件中可以描述插件的相关数据信息
(上面代码中指向的a.json内容为{"name":"jack", "age":18},稍后可以看到)
测试方法的实现没啥好说了,只是返回一个字符串
[cpp] view plain copy
QString MyPlugin::Hello()
{
return "Hello";
}
调用的话也比较简单,就是通过QPluginLoader类
[cpp] view plain copy
{
QPluginLoader loader("C:/MyPlugin.dll");
if (loader.load())
{
QObject *obj = loader.instance();
if (obj)
{
IMyPlugin *plugin = qobject_cast<IMyPlugin*>(obj);
if (plugin)
{
// 测试插件方法
qDebug() << plugin->Hello();
// 输出插件元数据
qDebug() << loader.metaData();
}
// 需要手动释放
delete obj;
}
}
}
最后运行结果如图
/content/1526303.html
相关文章推荐
- 笔记:QT的模态对话框、非模态对话框及QLineEdit的验证器和补全器
- QT解析命令行(QCommandLineOption和QCommandLineParser类)
- 配置QtCreator+CDB远程调试环境(要设置_NT_SYMBOL_PATH和QT_PLUGIN_PATH和Path)
- 让VC2012生成的程序支持XP系统(QT的DLL都是支持XP的,只与EXE有关)
- Cogs 1672. [SPOJ375 QTREE]难存的情缘 LCT,树链剖分,填坑计划
- Qt 自定义控件应用QSS(setStyleSheet)设置由Q_PROPERTY设置的属性
- 基于Jmeter的MQTT测试插件-上
- qt翻译
- Qt信号和槽问题
- QT中qmlRegisterType qmlRegisterSingletonType的区别
- VS2013配置Qt5.4
- Ubuntu 15.10下Qt5的安装实战
- Ubuntu 15.10下Qt5的安装实战
- Qt窗体内控件自适应调整大小
- Qt 如何给Widget设置背景图片
- QT编程解决Error: no such instruction: `swpb %cl,%dl,[%edi]'
- Qt5下实现摄像头预览及捕获图像方法二(openCV3与Qt5交互使用)
- QT如何设置应用程序的图标
- 不需要用任何辅助工具打包Qt应用程序
- Ubuntu14.04 LTS安装 OpenCV-3.0.0-rc1 + QT5.4.1