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_OBJECT
Q_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 += core
TEMPLATE = lib
CONFIG += plugin
TARGET = 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
觉得有帮助的话,打赏一下呗。。