qt插件元数据不包含一个有效的元数据_Qt5个人软件插件使用(低级API)
前言
今天想看一些Qt 插件系统。看了之后发现Qt支持两种插件方式:高级 API 和低级 API。
高级 API 指的的为Qt软件本身定制插件;
低级 API 指的是为自己写的软件定制插件。
这篇文章主要讲的是如何编写使用一个低级 API,文章属于入门级的,只是简单使用。
Qt 插件和动态库区别(查找的)
Qt 插件本身是动态库,除此之外,它定义了一组专用的接口,从动态库中导出,供 Qt 的插件管理体系发现和调用。当你选择 Qt 插件项目模板时, Qt Creator 会自动为你插入专用接口相关的模板代码。
假如你从一个白板做起,实现一个动态库,要想客户方调用,还是需要导出 N 多的函数。而 Qt 这种,只是它约定了你需要导出什么函数、什么类、怎样查询你导出的接口,它定义了一套规范而已。
新建一个插件
1. 新建一个 C++库
2. 选择 Qt Plugin
3. Qt 插件名称,我这里是默认的根据需求来。下面的基类还没有研究过
编写插件代码(不要忘记看注释)
1. 新建一个头文件,作为插件导出的接口头文件。命名为: TestPluginBase.h。代码如下。
#ifndef TESTPLUGINBASE_H
#define TESTPLUGINBASE_H
class TestPluginBase
{
public:
virtual ~TestPluginBase() {}
virtual void test() = 0;
};
// Q_DECLARE_INTERFACE 告诉 Qt 这个纯虚类是一个插件接口类。
// 第一个参数: 接口类名
// 第二个参数: 插件标识符,标识符大小写敏感且必须唯一
Q_DECLARE_INTERFACE(TestPluginBase, "org.qt-project.Qt.QGenericPluginFactoryInterface/1.0")
#endif // TESTPLUGINBASE_H
2. 插件文件继承:QObject 和 TestPluginBase
头文件: GenericPlugin.h
#ifndef GENERICPLUGIN_H
#define GENERICPLUGIN_H
#include
#include
#include "testpluginbase.h"
class GenericPlugin : public QObject, public TestPluginBase
{
Q_OBJECT
// 调用此宏之前必须存在一个 Q_DECLARE_INTERFACE 声明的相应接口
Q_INTERFACES(TestPluginBase)
#if QT_VERSION >= 0x050000
// Q_PLUGIN_METADATA 用于描述插件元数据
// 第一个参数: IID 必须的
// 第二个参数: FILE 可选的用于描述插件的相关信息
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QGenericPluginFactoryInterface/1.0" FILE "TestPlugin.json")
#endif // QT_VERSION >= 0x050000
public:
GenericPlugin();
// 插件调用的方法。
// Q_DECL_OVERRIDE 用来声明这是一个对虚函数进行定义
// 的方法,编译器会验证该方法名是否是否父类中所有的,如果没有则报错 Q_DECL_OVERRIDE
void test();
};
#endif // GENERICPLUGIN_H
CPP 文件
#include "genericplugin.h"
#include
GenericPlugin::GenericPlugin()
{
}
void GenericPlugin::test()
{
qDebug() << "[" << __FUNCTION__ <<__line__ : qt plugin>
}
#if QT_VERSION < 0x050000
Q_EXPORT_PLUGIN2(TestPlugin, GenericPlugin)
#endif // QT_VERSION < 0x050000
TestPlugin.json
{
"Keys" : [ ],
// 以下信息是我自己定义的
"Name" : "测试插件",
"Desc" : "插件描述",
"Author": "HBQ",
"HomeUrl": "https://itzhai.cn",
"UseDesc": "使用描述"
}
Pro 文件修改
# DESTDIR = $$[QT_INSTALL_PLUGINS]/generic
DESTDIR = $$PWD/bin // jiang 将上面的注释修改成下面的 fangbian 方便找
3. 点击工程运行,生成插件。注意看是否生成 dll 文件。
插件的使用
1. 新建一个 Qt 控制台程序,复制 TestPluginBase.h 头文件到新建的控制台项目,结构如下
2. 插件使用代码
#include
#include
#include
#include
#include "testpluginbase.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QDir dir;
dir.setPath("./plugins");
if(!dir.exists()) { qDebug() << "[" << __FUNCTION__ <<__line__ : path no exist return>
foreach (QString filename, dir.entryList(QDir::Files)) {
qDebug() << "[" << __FUNCTION__ <<__line__ : dir.absolutefilepath>
QPluginLoader *loader = new QPluginLoader(dir.absoluteFilePath(filename));
if(!loader->load())
{
qWarning("%s is not a plugin",qPrintable(dir.absoluteFilePath(filename)));
continue;
}
QObject *obj = loader->instance();
TestPluginBase *plugin = qobject_cast(obj);
plugin->test(); // 调用插件方法
qDebug() << "[" << __FUNCTION__ <<__line__ : loader->metaData(); // 解析 json 文件
}
return a.exec();
}
3. 在软件运行的 Debug 目录上层新建一个 plugins 文件,将插件 dll 放入其中
4. 运行测试程序
总结
仔细详细那插件还是很有用的。虽然目前还没用到,但是一直还是想看,接下来去看看高级 API,Qt 自己的插件。这里只是简单使用,我也很菜,如有误导可以在下方留言喷我。
IT宅个人博客 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Qt5个人软件插件使用(低级API)
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
