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)


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部