QT之插件Plugin生成与使用(想一想,我有什么功能需要用它来实现呢?)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT之插件Plugin生成与使用(想一想,我有什么功能需要用它来实现呢?)相关的知识,希望对你有一定的参考价值。

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
//派生类头文件plugindemo.h
#include "plugindemoplugin.h"

class pluginDemo : public QObject, QtPluginDemoInterface
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtPluginDemoInterface" FILE "plugindemoplugin.json")
    Q_INTERFACES(QtPluginDemoInterface)

public:
    void printMessage(const QString& message) override;
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
//plugindemo.cpp
//在定义一个派生类去实现我们基类中的接口,编译生成库文件
void pluginDemo::printMessage(const QString& message)
{
    //在派生类中实现打印函数
    qDebug() << "---------------This is QtPluginDemoInterface Demo Test--------------" << message;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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

//plugintest.h
#include <QtWidgets/QMainWindow>
#include "ui_plugintest.h"

class QtPluginDemoInterface;
class PluginTest : public QMainWindow
{
    Q_OBJECT

public:
    PluginTest(QWidget *parent = 0);

private:
    Ui::PluginTestClass ui;
    QtPluginDemoInterface * m_echoInterface;
    bool loadPlugin();
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
//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<QtPluginDemoInterface *>(plugin);
            if (m_echoInterface)
                return true;
        }
    }

    return false;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

效果图

技术分享图片

结尾

只为记录,只为分享! 愿所写能对你有所帮助。Good Good Study, Day Day Up!

 

http://blog.csdn.net/ly305750665/article/details/78680647

以上是关于QT之插件Plugin生成与使用(想一想,我有什么功能需要用它来实现呢?)的主要内容,如果未能解决你的问题,请参考以下文章

Qt5的插件

Qt5的插件

Qt 插件开发 plugin 超详细 有源码四Qt扩展应用程序,插件创建和使用流程

Qt图表eCharts(想一想,我的程序需要使用JS来实现功能呢?)

在 qt 4.5 中,是不是可以在静态链接插件中拥有资源?

webpack学习记录-插件