QT 之 插件自定义编写

xiaoxiao2021-02-28  76

本Dem中在主GUI线程中通过一个按钮来加载插件,插件是一个简单的Dialog窗体,源代码工程链接:http://download.csdn.net/download/zhaoyuaiweide/9960801

运行结果如下:

下面是创建过程详细描述(QTPlugin中的宏的用法描述自行查找)

1   首先建立一个文件夹,名字叫project

2 进入新建的project文件夹,并创建一个文档,命名为:project.pro。

         在文档中编写:

#! [0] TEMPLATE = subdirs SUBDIRS = mainwindow \ plugins #! [0]

3 在project目录下创建一个文件夹:testwindows。在testwindows文件夹下创建一个界面类工程    

注意:删除main文件和pri中的有关main()函数的内容,更改testwindow.pri文件如下:

QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = taskwidget TEMPLATE = app INCLUDEPATH += $$PWD DEPENDPATH += $$PWD SOURCES += $$PWD/taskwidget.cpp HEADERS += $$PWD/taskwidget.h FORMS += $$PWD/taskwidget.ui  

4 在project目录下创建一个文件夹:plugins            在这个目录下我们将编写插件内容。 4.1 在plugins目录下创建一个文档,命名为:plugins.pro。在plugins.pro文档中写如下内容: include(interface/widgetinterface.pri) 4.2 在plugins目录下创建两个文件夹,分别是:tastwidget 和interface,其中tastwidget是创建的一个子工程界面类(可以先添加一个界面类工程在这里,随后将,pro文件名改为.pri),interface将会写一些插件的一些编写方法。

4.3   在interface文件夹中创建.pri文件,widgetinterface.h,widgetplugin.h,widgetplugin,cpp,widgetplugin.json。其中在.pri文件中需要写:

TEMPLATE = lib CONFIG += plugin INCLUDEPATH += $$PWD DEPENDPATH += $$PWD include(../taskwidget/taskwidget.pri) HEADERS += $$PWD/widgetinterface.h \ $$PWD/widgetplugin.h SOURCES += $$PWD/widgetplugin.cpp TARGET = widgetplugin DISTFILES += \ $$PWD/widgetplugin.json #添加资源文件

4.4   在widgeplugin.json中编写:

{ "Keys": [ "widgetplugin" ] } 4.5 在widgetinterface.h(插件类虚函数:定义好函数模板)文件中编写: #ifndef WIDGETINTERFACE_H #define WIDGETINTERFACE_H #define WIDGETINTERFACE_iid "zhaoyu.Example.WidgetInterface" #include <QWidget> class WidgetInterface { public: virtual ~WidgetInterface() {} virtual QWidget* createWidget(QWidget *parent) = 0; }; Q_DECLARE_INTERFACE(WidgetInterface, WIDGETINTERFACE_iid) #endif // WIDGETINTERFACE_H

4.5 在widgetplugin.h(插件类的实现)中编写:

#ifndef WIDGETPLUGIN_H #define WIDGETPLUGIN_H #include "widgetinterface.h" #include <QObject> #include <QtPlugin> #include "QString" class WidgetPlugin : public QObject, WidgetInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "zhaoyu.Example.WidgetInterface" FILE "widgetplugin.json") Q_INTERFACES(WidgetInterface) public: WidgetPlugin(QObject *parent = 0); QWidget *createWidget(QWidget *parent) Q_DECL_OVERRIDE; }; #endif // WIDGETPLUGIN_H

4.6 widgetplugin.cpp中编写:

#include "widgetplugin.h" #include "taskwidget.h" WidgetPlugin::WidgetPlugin(QObject *parent) :QObject(parent) { } QWidget *WidgetPlugin::createWidget(QWidget *parent) { return new TaskWidget(parent); } 4.7 返回project目录下,进入testwindows目录,在testwindows.pro中加入: INCLUDEPATH += ../plugins/uis \ ../plugins/interface LIBS = -L ../plugins

4.8 在testwindows界面类中加入:判断插件是否加载成功的成员函数

增加头文件:#include <QDir>

     #include <QPluginLoader>

             #include <widgetinterface.h>

在.h文件中定义接口类对象:

WidgetInterface *m_wInterface;        

        QWidget *m_plgWidget;

QDir pluginsDir(qApp->applicationDirPath()); pluginsDir.cdUp(); pluginsDir.cd("plugins"); foreach(QString fileName, pluginsDir.entryList(QDir::Files)) { QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName)); QObject *plugin = pluginLoader.instance(); if(plugin) { m_wInterface = qobject_cast<WidgetInterface *>(plugin); if(m_wInterface) return true; } } return false; 4.9 创建->所加载的插件de对象 并操作插件类中的成员函数。 if(this->loadPlugin()) { m_plgWidget = m_wInterface->createWidget(this); this->setCentralWidget(m_plgWidget); } else { qDebug() << "plugin load failed !"; }

转载请注明原文地址: https://www.6miu.com/read-85082.html

最新回复(0)