qt 插件式开发框架

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

 

  • 8
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

究极调参工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值