1,新建工程,主程序。
//PluginTest.h
#include <QDir>
#include <QApplication>
#include <QMenuBar>
class PluginTest : public QMainWindow
{
Q_OBJECT
public:
PluginTest(QWidget *parent = Q_NULLPTR);
private slots:
void on_widgetAction_trigger();
private:
int LoadPlugins();
void addPopMenu(QObject * pluginInterface, MainInterface*i);
};
#include "PluginTest.h"
PluginTest::PluginTest(QWidget *parent)
: QMainWindow(parent)
{
LoadPlugins();
}
void PluginTest::on_widgetAction_trigger()
{
QWidget *centerWidget = qobject_cast<MainInterface*>(sender()->parent())->centerWidget();
setCentralWidget(centerWidget);
}
int PluginTest::LoadPlugins()
{
int count = 0;
QDir pluginsDir = QDir(qApp->applicationDirPath());
if (!pluginsDir.cd("plugins")) return -1;
foreach(QString fileName, pluginsDir.entryList(QDir::Files))
{
QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
QObject *plugin = pluginLoader.instance();
if (plugin)
{
auto centerInterface = qobject_cast<MainInterface*>(plugin);
if (centerInterface)
{
++count;
//加载插件后生成menu
addPopMenu(plugin, centerInterface);
}
}
}
return count;
}
void PluginTest::addPopMenu(QObject * pluginInterface, MainInterface * i)
{
static auto menu = menuBar()->addMenu("widgets");
auto act = new QAction(i->name(), pluginInterface);
//单击menu调用插件
connect(act, &QAction::triggered, this, &PluginTest::on_widgetAction_trigger);
menu->addAction(act);
}
2,新建类MainInterface
#pragma once
#include <QString>
#include <QWidget>
#include <QPluginLoader>
class MainInterface
{
public:
virtual ~MainInterface() {}
virtual QString name() = 0;
virtual QString information() = 0;
//返回一个Widget设置到centerwidget中进行显示
virtual QWidget *centerWidget() = 0;
};
//step 2 声明接口
#define MainInterface_iid "com.Interface.MainInterface"
Q_DECLARE_INTERFACE(MainInterface, MainInterface_iid)
完成以上操作即可读取当前目录下的plugins文档中的dll文件。
3,创建dll项目
#pragma once
#include "plugindll_global.h"
#include <QWidget>
#include "MainInterface.h"
class PLUGINDLL_EXPORT pluginDll
:public QWidget
, public MainInterface
{
Q_OBJECT
//Q_INTERFACES 宏用于告诉 Qt 该类实现的接口。
Q_INTERFACES(MainInterface)
//Q_PLUGIN_METADATA宏用于描述插件元数据
Q_PLUGIN_METADATA(IID MainInterface_iid)
public:
pluginDll(QWidget *parent=Q_NULLPTR);
virtual QString name() override;
virtual QString information() override;
virtual QWidget *centerWidget() override;
};
#include "pluginDll.h"
#include <QLabel>
#include <QHBoxLayout>
pluginDll::pluginDll(QWidget *parent):QWidget(parent)
{
QLabel *l = new QLabel("this is test for plugin windows");
QHBoxLayout* hlay = new QHBoxLayout();
hlay->addWidget(l);
this->setLayout(hlay);
}
QString pluginDll::name()
{
return "plugin1";
}
QString pluginDll::information()
{
return "plugin1";
}
QWidget * pluginDll::centerWidget()
{
return this;
}
把生成的Dll拷贝到主程序项目的plugins目录下,运行主程序即可加载界面。
完整工程下载地址:https://download.csdn.net/download/qq_33628827/11969110