通过看官方的示例代码,参考示例echoplugin,总结插件的创建步骤如下
1.定义一个插件接口,在接口外部定义插件的标识符iid,并用宏声明接口
#define ECHOINTERFACE_H
#include <QString>
//! [0]
class EchoInterface
{
public:
virtual ~EchoInterface() {}
virtual QString echo(const QString &message) = 0;
};
QT_BEGIN_NAMESPACE
#define EchoInterface_iid "org.qt-project.Qt.Examples.EchoInterface"
Q_DECLARE_INTERFACE(EchoInterface, EchoInterface_iid)
QT_END_NAMESPACE
//! [0]
#endif
2. 在插件工程的pro文件里加入以下关键语句,其中的echoplugin.json是一个空文件
TEMPLATE = lib
CONFIG += plugin
EXAMPLE_FILES = echoplugin.json
CONFIG += install_ok
示例中提供的pro完整文件如下
#! [0]
TEMPLATE = lib
CONFIG += plugin
QT += widgets
INCLUDEPATH += ../echowindow
HEADERS = echoplugin.h
SOURCES = echoplugin.cpp
TARGET = $$qtLibraryTarget(echoplugin)
DESTDIR = ../plugins
#! [0]
EXAMPLE_FILES = echoplugin.json
# install
target.path = $$[QT_INSTALL_EXAMPLES]/widgets/tools/echoplugin/plugins
INSTALLS += target
CONFIG += install_ok # Do not cargo-cult this!
3. 新建一个插件类,继承自QObject和插件接口,在类中声明使用宏Q_PLUGIN_METADATA 和Q_INTERFACES,重写插件接口中的方法。
#ifndef ECHOPLUGIN_H
#define ECHOPLUGIN_H
#include <QObject>
#include <QtPlugin>
#include "echointerface.h"
//! [0]
class EchoPlugin : public QObject, EchoInterface
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.Examples.EchoInterface" FILE "echoplugin.json")
Q_INTERFACES(EchoInterface)
public:
QString echo(const QString &message) override;
};
//! [0]
#endif
4. 以上就是插件工程的步骤,在使用插件时,先加载插件,得到一个QObject的指针,再转换为插件接口类型,最后就可以调用插件中的方法。以下代码是参照示例代码得到的简化版,删除了其他无关代码。
#include <QCoreApplication>
#include <QDir>
#include <QPluginLoader>
#include <QDebug>
#include "echo_interface.h"
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
echo_interface *echoInterface = nullptr;
// 插件的路径
QPluginLoader pluginLoader("C:/Users/dell/Documents/build-plugintest-Desktop_Qt_5_9_2_MinGW_32bit-Debug/plugin_tst/debug/plugin_tst.dll");
QObject *plugin = pluginLoader.instance();
if (plugin) {
echoInterface = qobject_cast<echo_interface *>(plugin);
}
// 调用插件中的方法
QString str = echoInterface->echo("abc");
qDebug() << str; // abc
return app.exec();
}