1、创建插件项目
在Qt Creator中,选择 “File” -> “New File or Project” -> “Library” -> “Qt Library” -> “Choose...”,然后按照向导完成项目 MyPlugin 创建。
2、定义插件接口
定义一个插件接口类,所有插件都需要实现这个接口:
#ifndef PLUGININTERFACE_H
#define PLUGININTERFACE_H#include <QObject>class PluginInterface {
public:virtual ~PluginInterface() {}virtual void doSomething() = 0;
};#define PluginInterface_iid "com.example.PluginInterface"
Q_DECLARE_INTERFACE(PluginInterface, PluginInterface_iid)#endif // PLUGININTERFACE_H
3、实现插件
在插件项目中,实现插件接口:
myplugin.h
#ifndef MYPLUGIN_H
#define MYPLUGIN_H#include <QObject>
#include "plugininterface.h"class MyPlugin : public QObject, public PluginInterface {Q_OBJECTQ_PLUGIN_METADATA(IID PluginInterface_iid)Q_INTERFACES(PluginInterface)public:void doSomething() override;
};#endif // MYPLUGIN_H
myplugin.cpp
#include "myplugin.h"
#include <QDebug>void MyPlugin::doSomething() {qDebug() << "MyPlugin is doing something!";
}
myplugin.pro
QT += coreTEMPLATE = lib
CONFIG += pluginTARGET = myplugin
HEADERS += myplugin.h
SOURCES += myplugin.cpp
4、加载和使用插件
4.1 创建主项目
在Qt Creator中,选择“File” -> “New File or Project” -> “Application” -> “Qt Widgets Application” -> “Choose...”,然后按照向导完成项目创建。
4.2 加载插件
在主项目中,使用QPluginLoader加载和使用插件:
#include "mainwindow.h"#include <QApplication>
#include <QDebug>
#include <QPluginLoader>
#include "plugininterface.h"int main(int argc, char *argv[])
{QApplication a(argc, argv);QPluginLoader loader("myplugin");QObject *plugin = loader.instance();if (plugin) {PluginInterface *interface = qobject_cast<PluginInterface *>(plugin);if (interface) {interface->doSomething();} else {qDebug() << "Failed to cast plugin to PluginInterface.";}} else {qDebug() << "Failed to load plugin:" << loader.errorString();}MainWindow w;w.show();return a.exec();
}
main.pro:
HEADERS += plugininterface.h# 添加插件库路径
LIBS += -L$$OUT_PWD/../myplugin -lmyplugin# 添加插件接口头文件路径
INCLUDEPATH += $$PWD/../myplugin
5、动态查找插件路径
QDir pluginsDir(qApp->applicationDirPath());
pluginsDir.cd("plugins");foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {QPluginLoader loader(pluginsDir.absoluteFilePath(fileName));QObject *plugin = loader.instance();if (plugin) {PluginInterface *interface = qobject_cast<PluginInterface *>(plugin);if (interface) {interface->doSomething();} else {qDebug() << "Failed to cast plugin to PluginInterface.";}} else {qDebug() << "Failed to load plugin:" << loader.errorString();}
}
qq群交流:698593923
觉得有帮助的话,打赏一下呗。。