由于目前网上的大多资料都是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函数来卸载插件。

2719

被折叠的 条评论
为什么被折叠?



