20.QT中插件编程

插件编程

 插件可以理解为动态库,一种固定接口的动态库.以下摘自网友的理解。代码参考自官方示例。

Qt插件本身是动态库,除此之外,它定义了一组专用的接口,从动态库中导出,供 Qt 的插件管理体系 发现和调用。当你选择 Qt 插件项目模板时, Qt Creator 会自动为你插入专用接口相关的模板代码。
假如你从一个白板做起,实现一个动态库,要想客户方调用,还是需要导出N多的函数。而 Qt
这种,只是它约定了你需要导出什么函数、什么类、怎样查询你导出的接口,它定义了一套规范而已。
在这里插入图片描述

在这里插入图片描述

接口定义

echo_interface.h

#pragma once

#include <QString>
#include <QObject>

class EchoInterface
{
public:
	virtual ~EchoInterface() {}
	virtual QString echo(const QString &message) = 0;
};

#define EchoInterface_iid  "org.Examples.EchoInterface"

//接口申明.
Q_DECLARE_INTERFACE(EchoInterface, "org.Examples.EchoInterface") //类名. 

插件调用

EchoPluginWindows.h

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_EchoPluginWindows.h"
#include "echo_interface.h"

class QString;
class QLineEdit;
class QLabel;
class QPushButton;
class QGridLayout;

class EchoPluginWindows : public QMainWindow
{
    Q_OBJECT

public:
    EchoPluginWindows(QWidget *parent = Q_NULLPTR);

private slots:
   void send_echo();

private:
    Ui::EchoPluginWindowsClass ui;

	bool loadPlugin();

	EchoInterface * echo_interface;

};

EchoPluginWindows.cpp

#include "EchoPluginWindows.h"
#include <QMessageBox>
#include <QDir>
#include <QPluginLoader>
#include <QtPlugin>
#include <QFileInfo>
#include <QDebug>


EchoPluginWindows::EchoPluginWindows(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
	setWindowTitle("Echo Plugin Example");

	if (!loadPlugin())
	{
		QMessageBox::information(this,"Error", "Could not load the plugin");
		ui.lineEdit_msg->setEnabled(false);
		ui.pushButton->setEnabled(false);
	}

	connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(send_echo()));

}


//发送消息槽函数
void EchoPluginWindows::send_echo()
{
	QString text = echo_interface->echo(ui.lineEdit_msg->text());

	ui.lineEdit_answer->setText(text);
}

//加载插件
bool EchoPluginWindows::loadPlugin()
{
	QDir  pluginDir(QApplication::applicationDirPath());

	if (pluginDir.dirName().toLower() == "debug" || pluginDir.dirName().toLower() == "release")
	{
		qDebug() << "applicationDirPath:" << QApplication::applicationDirPath();
		pluginDir.cdUp();  //回到上一级
		pluginDir.cdUp();  //回到上一级
	}
	
	pluginDir.cd("plugin");
	pluginDir.cd("Debug");


	for each (QFileInfo file_name in pluginDir.entryInfoList(QDir::Files))
	{
		//插件加载器
		QPluginLoader pluginLoader(file_name.absoluteFilePath());

		QObject * plugin = pluginLoader.instance();
		if (plugin)
		{
			echo_interface = qobject_cast<EchoInterface *>(plugin);
			if (echo_interface)
			{
				return true;
			}
		}

	}

	return false;
}


插件库

按照插件接口定义,编写自己的插件库 echo_plugin.h

#pragma once

#include "echo_interface.h"
#include <QObject>

class  EchoPlugin : public QObject, EchoInterface
{
	Q_OBJECT
    Q_PLUGIN_METADATA(IID "com.xhome.EchoPlugin")  //插件元信息.
    Q_INTERFACES(EchoInterface)  //接口申明.

public:
	QString echo(const QString &message) override;

};

echo_plugin.cpp

#include "echo_plugin.h"
#include <QtWidgets/QtWidgets>

//对接口进行实现即可.
QString EchoPlugin::echo(const QString &message)
{
	return message;
}

结果演示

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

guangshui516

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

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

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

打赏作者

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

抵扣说明:

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

余额充值