QT 之 插件自定义编写

来源:互联网 发布:淘宝店铺设计师申请 编辑:程序博客网 时间:2024/03/28 20:15

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

运行结果如下:



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


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


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

         在文档中编写:

#! [0]TEMPLATE    = subdirsSUBDIRS    = mainwindow \              plugins#! [0]

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

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

QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = taskwidgetTEMPLATE = appINCLUDEPATH += $$PWDDEPENDPATH += $$PWDSOURCES += $$PWD/taskwidget.cppHEADERS  += $$PWD/taskwidget.hFORMS    += $$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        = libCONFIG         += pluginINCLUDEPATH += $$PWDDEPENDPATH  += $$PWDinclude(../taskwidget/taskwidget.pri)HEADERS  += $$PWD/widgetinterface.h \         $$PWD/widgetplugin.hSOURCES +=  $$PWD/widgetplugin.cppTARGET  =   widgetpluginDISTFILES += \        $$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/interfaceLIBS = -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 !";}







原创粉丝点击