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 !";}
- QT 之 插件自定义编写
- Qt编写自定义插件
- Qt编写自定义控件插件路过的坑及注意事项
- Qt编写自定义控件及插件的使用
- Qt编写自定义控件插件路过的坑及注意事项
- Android Cordova 插件开发之编写自定义插件
- Android Cordova 插件开发之编写自定义插件
- Android Cordova 插件开发之编写自定义插件
- Android Cordova 插件开发之编写自定义插件
- Android Cordova 插件开发之编写自定义插件
- Qt之自定义插件(for Qt Designer)
- 编写自定义Maven2插件
- jQuery自定义插件编写
- 编写jquery 自定义插件
- cordova 编写自定义插件
- 自定义Qt插件
- QT的Webkit 编写插件
- 用Qt编写Maya插件
- 机器学习中的多分类任务入门
- yum安装vsftpd时提示:另外一个程序锁定了 yum
- 解决Idea创建maven-archetype-webapp项目无java目录的问题
- Aizu 2224 Save your cats(最大生成树)
- 关于Spring中的<context:annotation-config/>配置
- QT 之 插件自定义编写
- CAS原理
- Spring boot中的属性配置文件小结
- yii2源码(1)--执行流程
- NavigationView+DrawerLayout实现侧滑栏效果
- C#小项目之登录界面1
- CSS margin 属性
- Spring-boot + atomikos + druid分布式事务配置
- C# 逆变与协变