Qt5插件开发

AI 驱动代码审查实战

Claude code-review 插件深度解析,把 AI 智能审查接进 CI/CD 流水线

由于目前网上的大多资料都是Qt4版本下的插件开发,在Qt5有一些改动,主要是Q_EXPORT_PLUGIN2()被舍弃,经过自己实践整理出Qt5下插件开发的流程。

Qt在开发插件时的步骤一般有三步:

第一步:创建接口

在工程目录,也就是需要添加插件的工程下,创建一个新的类,可以称作接口类,需要注意的是接口类必须是一个纯虚函数
在接口类的最后,必须使用宏Q_DECLARE_INTERFACE()。他的第一个参数是这个接口的名字,第二个参数是一个确定接口的字符串。

#ifndef FILTERINTERFACE_H
#define FILTERINTERFACE_H
class FilterInterface
{
public:
     virtual ~FilterInterface() {}
     virtual void test() = 0;
};
Q_DECLARE_INTERFACE(FilterInterface,"com.trolltech.PlugAndPaint.BrushInterface/1.0")
#endif // FILTERINTERFACE_H

第二步:插件类的实现,插件类可以新建一个项目进行

插件类必须继承自QObject,在实现插件类前需要先配置插件类的pro

TEMPLATE = lib
CONFIG += plugin
INCLUDEPATH += "E:/chajian/Interface"

includepath为上一步的接口类的头文件
插件类的定义:

#ifndef EXTRAFILTERSPLUGIN_H
#define EXTRAFILTERSPLUGIN_H
#include <QObject>
#include <QtPlugin>
#include <filterinterface.h>
class ExtraFiltersPlugin : public QObject, public FilterInterface
{
    Q_OBJECT
    Q_INTERFACES(FilterInterface)
    #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
        Q_PLUGIN_METADATA(IID "com.trolltech.PlugAndPaint.BrushInterface/1.0" FILE "")
    #endif
public:
    explicit ExtraFiltersPlugin(QObject *parent = 0);
    void test();
signals:
public slots:
};
#endif // EXTRAFILTERSPLUGIN_H

Q_PLUGIN_METADATA() IID为第一步接口的字符串,FILE 是JSON文件的路径,可为空
插件类的实现:

#include "extrafiltersplugin.h"
#include <QDebug>
ExtraFiltersPlugin::ExtraFiltersPlugin(QObject *parent) : QObject(parent)
{
}
void ExtraFiltersPlugin::test()
{
    qDebug () << "test plugin";
}
//版本检查
#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
    Q_EXPORT_PLUGIN2(PlugExtraFilters,ExtraFiltersPlugin)
#endif

Q_EXPORT_PLUGIN2()是4.0版本的,在5.0版本被舍弃,所以需要Q_PLUGIN_METADATA() 来验证

第三步 调用插件

#include "mainwindow.h"
#include <QApplication>
#include <QPluginLoader>
#include "filterinterface.h"
#include <QDebug>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QPluginLoader loader("E:/chajian/build-Plugin-Desktop_Qt_5_8_0_MinGW_32bit-Debug/debug/Plugin.dll");
    QObject *plugin = loader.instance();
    if (plugin) 
    {
        qDebug() << "plugin";
        FilterInterface *fff = qobject_cast<FilterInterface *>(plugin);
        fff->test();
    }
    MainWindow w;
    w.show();
    return a.exec();
}

同样也需要包含接口类的头文件。
QPluginLoader类提供了一个函数loader来加载插件的实例,如果动态链接库不是一个插件,或者编译的Qt的版本库不对,返回的QObject对象的指针为空。
使用unload函数来卸载插件。

AI 驱动代码审查实战

Claude code-review 插件深度解析,把 AI 智能审查接进 CI/CD 流水线

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值