qt插件Plugin生成与使用

简述

有时候,我们在做一个应用程序的时候,并不希望我们生成的软件仅仅是一个EXE文件,而是拆分成各个模块,越细越好。在未来更新发布中,都是非常的便利,我们更新的只是其中某一小部分,而不是整个应用程序。(说到这里,我们看代码吧)

插件生成

//我们先定义一个接口头文件plugindemoplugin.h
QT_BEGIN_NAMESPACE
class QtPluginDemoInterface
{
public:virtual ~QtPluginDemoInterface() {}//接口中声明一个打印函数 virtual void printMessage(const QString& message) = 0; }; #define QDesignerCustomWidgetInterface_iid "org.qt-project.QtPluginDemoInterface" Q_DECLARE_INTERFACE(QtPluginDemoInterface, QDesignerCustomWidgetInterface_iid) QT_END_NAMESPACE
//派生类头文件plugindemo.h
#include "plugindemoplugin.h"class pluginDemo : public QObject, QtPluginDemoInterface
{Q_OBJECTQ_PLUGIN_METADATA(IID "org.qt-project.Qt.QtPluginDemoInterface" FILE "plugindemoplugin.json") Q_INTERFACES(QtPluginDemoInterface) public: void printMessage(const QString& message) override; };
//plugindemo.cpp
//在定义一个派生类去实现我们基类中的接口,编译生成库文件
void pluginDemo::printMessage(const QString& message)
{//在派生类中实现打印函数 qDebug() << "---------------This is QtPluginDemoInterface Demo Test--------------" << message; }

接下来,我们在我们的UI主程序中加载此插件

//plugintest.h
#include 
#include "ui_plugintest.h"class QtPluginDemoInterface;
class PluginTest : public QMainWindow
{Q_OBJECTpublic: PluginTest(QWidget *parent = 0); private: Ui::PluginTestClass ui; QtPluginDemoInterface * m_echoInterface; bool loadPlugin(); };
//plugintest.cpp
PluginTest::PluginTest(QWidget *parent): QMainWindow(parent)
{ui.setupUi(this);loadPlugin();connect(ui.pushButton, &QPushButton::clicked, [this](){m_echoInterface->printMessage("123456789");});
}bool PluginTest::loadPlugin() { QDir pluginsDir(qApp->applicationDirPath()); //这里我新建了plugins文件夹,把上面生成的dll文件放到此文件夹下 pluginsDir.cd("plugins"); //加载当前文件夹下的库文件 foreach(QString fileName, pluginsDir.entryList(QDir::Files)) { QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName)); QObject *plugin = pluginLoader.instance(); if (plugin) { m_echoInterface = qobject_cast(plugin); if (m_echoInterface) return true; } } return false; }

效果图

这里写图片描述


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部