QT 之 插件自定义编写

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhaoyuaiweide/article/details/77774231

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

运行结果如下:



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


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


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

         在文档中编写:

扫描二维码关注公众号,回复: 3829171 查看本文章
#! [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 !";
}







猜你喜欢

转载自blog.csdn.net/zhaoyuaiweide/article/details/77774231