Qt5插件开发

由于目前网上的大多资料都是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 
#include 
#include 
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 
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 
#include 
#include "filterinterface.h"
#include 
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(plugin);
        fff->test();
    }
    MainWindow w;
    w.show();
    return a.exec();
}

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

你可能感兴趣的:(qt)