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