系列文章目录
第一章 Qt插件创建并调用插件
第二章 Qt创建插件管理器统一管理插件
第三章 Qt插件之间相互通信
第四章 Qt创建并加载一个窗口插件
第五章 Qt插件工程作为子工程
前言
一、插件创建流程
1.创建插件的基类
#ifndef PLUGININTERFACE_H
#define PLUGININTERFACE_H
#include<QtPlugin>
class PluginInterface
{
public:
virtual ~PluginInterface() {}
virtual QString name() const = 0;
};
Q_DECLARE_INTERFACE(PluginInterface,"org.galaxyworld.plugins.PluginInterface/1.0")
#endif // PLUGININTERFACE_H
Q_DECLARE_INTERFACE(interface, identifier):
该宏用于声明一个接口类,并为其生成相关的元对象代码。接口类通常被用作插件开发中的基类,通过该宏可以让Qt识别接口并进行相应的操作。此宏把标识符与类名接口关联起来。这个标识符是唯一的
2.让插件继承插件接口基类和QObject类,并实现接口中定义的函数
#ifndef PLUGIN01_H
#define PLUGIN01_H
#include "Plugin01_global.h"
#include<QObject>
#include"PluginInterface.h"
class PLUGIN01_EXPORT Plugin01 : public QObject , PluginInterface
{
Q_OBJECT
Q_INTERFACES(PluginInterface)
Q_PLUGIN_METADATA(IID "plugin01")
public:
Plugin01();
virtual QString name() const override
{
return "this is Plugin01";
}
};
#endif // PLUGIN01_H
Q_INTERFACES(…):
该宏用于在具体的实现类中声明所支持的接口。将要实现的接口类型作为参数传递给该宏即可。此宏告诉Qt哪些接口被类实例了。这个宏通常用于插件的实例。
Q_PLUGIN_METADATA(IID, FILE):
该宏用于在插件项目中定义元数据信息。IID参数是接口标识符,表示插件所实现的接口类型;FILE参数是插件库文件路径,指定了包含插件元数据信息的JSON文件。
二、调用插件测试
QDir pluginsDir(QDir::currentPath());
pluginsDir.cd("..\\..\\Lib");
foreach(QString fileName,pluginsDir.entryList(QDir::Files))
{
QFileInfo pluginFileInfo(fileName);
if(pluginFileInfo.completeSuffix() == "dll" || \
pluginFileInfo.completeSuffix() == "so")
{
QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName),nullptr);
QObject *plugin = pluginLoader.instance();
if(plugin)
{
PluginInterface *monster = qobject_cast<PluginInterface *>(plugin);
qDebug() << monster->name();
}
}
}
QPluginLoader
是 Qt 提供的一个用于动态加载插件的类。使用 QPluginLoader,你可以在程序运行时加载指定的插件库,并且调用其中定义的函数,也可以在程序运行时卸载插件。
instance():
用于获取插件库中的实例对象,返回值是一个 QObject 类型的指针。
QPluginLoader常用成员函数
构造函数:QPluginLoader(const QString &fileName, QObject *parent = nullptr)。用于新建一个QPluginLoader 对象,fileName 参数表示要加载的插件库文件名,parent 参数表示父对象。
load():bool。用于加载指定的插件库文件,返回值表示是否加载成功。
unload():void。用于卸载已经加载的插件库。
instance():QObject *。用于获取插件库中的实例对象,返回值是一个 QObject 类型的指针。
errorString():QString。用于获取最近一次发生的错误信息。
setFileName():void。用于设置要加载的插件库文件名。
fileName():QString。用于获取当前加载的插件库文件名。
isLoaded():bool。用于判断当前是否已经加载了插件库。
isAvailable():bool。用于判断当前插件库是否可用(即是否存在并能够被加载)。
static staticPlugins():QList。用于获取所有可用的插件库文件列表。