本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 !";
}