【Qt之·Qt插件开发·(1)插件创建并调用插件】

系列文章目录

第一章 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。用于获取所有可用的插件库文件列表。

总结

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值