QT中QtPlugin插件的使用

QT本身就是带有插件系统的,可以使用QT自身携带的插件系统开发自己的插件。插件的好处:就是可以使多人同时开发,在使用的时候再加载起来。下面通过一个Demo来实现插件的管理。

1.定义接口

首先新建一个含有计算的接口工程:
在这里插入图片描述

QtMathInterface.h

#pragma once
#include <QtPlugin>
#include "qtmathinterface_global.h"

class QTMATHINTERFACE_EXPORT QtMathInterface {
public:
	QtMathInterface();
	virtual double mathRusult(double arg1, double arg2) = 0;
};

#define Math_interface_iid "Math_interface_iid"
Q_DECLARE_INTERFACE(QtMathInterface, Math_interface_iid)

QtMathInterface.cpp 这个Cpp可有可无

#include "QtMathInterface.h"

QtMathInterface::QtMathInterface() {
}

2. 定义第一个插件:加法。

同样新建一个DLL工程
在这里插入图片描述
qtadd_global.h

#pragma once

#include <QtCore/qglobal.h>

#ifndef BUILD_STATIC
# if defined(QTADD_LIB)
#  define QTADD_EXPORT Q_DECL_EXPORT
# else
#  define QTADD_EXPORT Q_DECL_IMPORT
# endif
#else
# define QTADD_EXPORT
#endif

#pragma comment(lib,"../x64/Release/QtMathInterface.lib")

QtAdd.h

#pragma once
#include <QObject>
#include "qtadd_global.h"
#include "../QtMathInterface/QtMathInterface.h"

class QTADD_EXPORT QtAdd
	:public QObject
	,public QtMathInterface
{
	Q_OBJECT
	Q_PLUGIN_METADATA(IID Math_interface_iid FILE "QtMath.json")
	Q_INTERFACES(QtMathInterface)
public:
	QtAdd();

	double mathRusult(double arg1, double arg2)override;
};

QtAdd.cpp

#include "QtAdd.h"

QtAdd::QtAdd() {
}

double QtAdd::mathRusult(double arg1, double arg2) {
	return arg1 + arg2;
}

添加QtMath.json文件
在这里插入图片描述
文件内容:

{
    "version":100
}

3. 定义第二个插件:减法。

新建一个DLL工程
在这里插入图片描述
qtsub_global.h

#pragma once

#include <QtCore/qglobal.h>

#ifndef BUILD_STATIC
# if defined(QTSUB_LIB)
#  define QTSUB_EXPORT Q_DECL_EXPORT
# else
#  define QTSUB_EXPORT Q_DECL_IMPORT
# endif
#else
# define QTSUB_EXPORT
#endif
#pragma comment(lib,"../x64/Release/QtMathInterface.lib")

QtSub.h

#pragma once
#include <QObject>
#include "qtsub_global.h"
#include "../QtMathInterface/QtMathInterface.h"

class QTSUB_EXPORT QtSub
	: public QObject
	, public QtMathInterface
{
	Q_OBJECT
	//使用Q_PLUGIN_METADATA ()宏导出插件。
	Q_PLUGIN_METADATA(IID Math_interface_iid FILE "QtMath.json")
	//使用Q_INTERFACES ()宏告诉Qt的元对象系统有关接口的信息
	Q_INTERFACES(QtMathInterface)
public:
	QtSub();

	double mathRusult(double arg1, double arg2)override;
};

QtSub.cpp

#include "QtSub.h"

QtSub::QtSub()
{
}

double QtSub::mathRusult(double arg1, double arg2) {
	return arg1 - arg2;
}

4. 编写调用程序

新建一个GUI工程。
在这里插入图片描述
QtGuiCallInterface.h

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_QtGuiCallInterface.h"
#pragma comment(lib,"../x64/Release/QtMathInterface.lib")

class QtMathInterface;

class QtGuiCallInterface : public QMainWindow
{
	Q_OBJECT

public:
	QtGuiCallInterface(QWidget *parent = Q_NULLPTR);

private:
	void init();

private slots:
	void slotCal();
private:
	Ui::QtGuiCallInterfaceClass ui;

	QtMathInterface* _mathInterface = nullptr;
};

QtGuiCallInterface.cpp

#include <QDir>
#include <QMessageBox>
#include <QDebug>
#include <QPluginLoader>
#include "QtGuiCallInterface.h"
#include "../QtMathInterface/QtMathInterface.h"

QtGuiCallInterface::QtGuiCallInterface(QWidget *parent)
	: QMainWindow(parent) {
	ui.setupUi(this);
	init();
}

void QtGuiCallInterface::init() {
	connect(ui.pushButtonCal, SIGNAL(clicked()), this, SLOT(slotCal()));

	// 进入插件目录
	QDir pluginsDir(qApp->applicationDirPath());
	pluginsDir.cd("Plugin");

	// 遍历插件目录
	foreach(QString fileName, pluginsDir.entryList(QDir::Files)) {
		QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
		QObject *plugin = pluginLoader.instance();
		if (plugin) {
			_mathInterface = qobject_cast<QtMathInterface *>(plugin);
			if (_mathInterface == nullptr) {
				QMessageBox::information(this, "错误", "插件加载失败");
			}
		}
	}
}

void QtGuiCallInterface::slotCal() {
	double arg1 = ui.lineEdit1->text().toDouble();
	double arg2 = ui.lineEdit2->text().toDouble();
	double rest = _mathInterface->mathRusult(arg1, arg2);
	ui.lineEditRes->setText(QString::number(rest));
}

把编写好的加法插件拷到Plugin目录下面,运行程序,展示就是加法运算:
请添加图片描述
把减法插件放到Plugin目录下面,再次运行程序,展示就是减法运算:
请添加图片描述
aaa

Qt插件Plugins)是一种模块化的设计模式,它允许开发者创建可独立加载的代码库,以增强应用程序的功能。以下是使用Qt插件的基本步骤: 1. **设计插件接口**:首先,创建一个插件框架,定义一个或多个公共接口(通常是QPluginInterface),包含必要的函数、信号和属性。 ```cpp #include <QObject> class MyPluginInterface : public QObject { Q_OBJECT public: explicit MyPluginInterface(QObject* parent = nullptr); // 插件需要实现的一些功能 virtual void doSomething() = 0; signals: void pluginFinished(); }; ``` 2. **实现插件**:每个插件都需要实现指定的接口,并提供自己的功能。例如,`MyPlugin.cpp`: ```cpp #include "myplugininterface.h" class MyPlugin : public QObject, public MyPluginInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "com.example.MyPlugin") public: MyPlugin(QObject* parent = nullptr) : QObject(parent) {} ~MyPlugin() override {} void doSomething() override { /* 实现具体操作 */ } emit pluginFinished(); // 发出信号通知主程序 }; ``` 3. **注册插件**:为了让Qt能够识别和管理插件,需要在`qmake.pro`文件设置`PLUGINPATH`路径,并在`main.cpp`或其他适当位置动态加载插件: ```cpp #include <QCoreApplication> #include <QQmlEngine> #include <QDir> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QDir pluginsPath(QStringLiteral("path_to_your_plugin_directory")); QLibraryManager::addSearchPath(QLibraryInfo::LocationPlugins, pluginsPath.absoluteFilePath()); QQmlApplicationEngine engine; // 加载并激活插件 QPluginLoader loader(QStringLiteral("MyPlugin"), pluginsPath.absoluteFilePath()); if (!loader.load()) { qCritical() << loader.errorString(); return -1; } MyPluginInterface* plugin = qobject_cast<MyPluginInterface*>(loader.instance()); if (plugin) { plugin->doSomething(); connect(plugin, &MyPluginInterface::pluginFinished, &a, &QCoreApplication::quit); } else { qWarning() << "Failed to load plugin."; } return engine.rootObjects().isEmpty() ? a.exec() : 0; } ``` 4. **主程序使用插件**:在Qt应用通过QML或其他部分代码,你可以通过接口名称找到并使用插件提供的功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wb175208

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

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

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

打赏作者

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

抵扣说明:

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

余额充值