简述
制作插件,首先,需要一个插件接口,并且,为了后期团队并行开发,或者请第三方的厂商帮忙开发,所以要将插件接口编译成共享库,这样可以防止接口不小心被修改,导致插件不兼容。
工程文件
在多工程目录中添加一个PluginWidget
插件工程。在 PluginWidget.pro
文件中,将TEMPLATE
设置为 lib
, 添加 CONFIG += plugin
和 DESTDIR = ../bin
.
共享库 : TEMPLATE = lib
插件: CONFIG += plugin
指定目标文件生成路径: DESTDIR = …/bin
#-------------------------------------------------
#
# PluginWidget.pro 工程文件
#
#-------------------------------------------------
QT += widgets
TARGET = PluginWidget
TEMPLATE = lib
CONFIG += plugin
DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += \
pluginwidget.cpp
HEADERS += \
pluginwidget.h \
DESTDIR = ../bin
这里,我们将插件生成在 bin 目录中。
头文件
- 后期的插件都是带GUI 的,所以插件接口直接继承了
QWidget
。 - 由于方法
QPluginLoader::instance()
不能获取同一个插件的多个实例,所以定义了一个newObj
的接口,用来获取插件的新实例对象。 - 宏
Q_DECLARE_INTERFACE
将接口PluginWidget
注册到Qt 元对象系统当中,第二个参数PluginWidget_iid
是一个接口标识,在整个应用程序当中,该id
必须是唯一的。
#ifndef WIDGETPLUGIN_H
#define WIDGETPLUGIN_H
#include <QWidget>
class PluginWidget : public QWidget
{
Q_OBJECT
public:
PluginWidget(QWidget *parent = 0);
virtual PluginWidget *newObj() = 0;
};
#define PluginWidget_iid "org.qt-project.Qt.Examples.PluginWidget"
Q_DECLARE_INTERFACE(PluginWidget, PluginWidget_iid)
#endif // WIDGETPLUGIN_H
生成插件接口
点击构建,Qt 将会在目录 bin 中生成一个库文件 PluginWidget.dll
,将共享库文件PluginWidget.dll
和上面的头文件 pluginwidget.h
分享出去,大家就可各自开工,实现自己的插件了。
注意 release 和 debug 版本,不同版本会存在不兼容的情况。