导出单一自定义组件

  1. 新建工程

  1. 创建后会自动生成两个类

Plugin结尾的类用于提供有用的组件信息给Qt Designer,非Plugin结尾的类表示自定义组件的实现。

导出单一组件时,需要Q_PLUGIN_METADATA宏,提供插件的元信息;Q_INTERFACES宏告诉Qt此类实现了哪个接口。下面一系列函数重写了QDesignerCustomWidgetInterface的接口。大致含义如下:

bool isContainer() const;//组件是否为容器,容器可包含其他QWidget
bool isInitialized() const;//是否已经初始化
QIcon icon() const;//Designer中的Widget Box的icon
QString domXml() const;//组件的属性描述。主要包括拖入时的默认大小
QString group() const;//Designer中的Widget Box的分组
QString includeFile() const;//uic自动生成时自动包括的头文件
QString name() const;//组件名称
QString toolTip() const;//Designer中组件tips
QString whatsThis() const;//Designer中组件详细说明
QWidget *createWidget(QWidget *parent);//创建组件
void initialize(QDesignerFormEditorInterface *core);//初始化组件

可以添加ui文件与QtDesignerWidget1类关联,在.ui中设计组件。

  1. 生成项目

生成一个QtDesignerWidget.dll和QtDesignerWidget.lib,将dll放到plugins\designer目录下,例如我的目录是:C:\Qt\Qt5.9\5.9.4\msvc2015_64\plugins\designer。注意路径版本要和使用的designer.exe对应,之后打开designer,可以在左侧看到自定义组件。

需要注意的是,以上方式生成的dll只能包含一个组件,并且在代码中无法直接new组件,因为类没有进行导出,类导出方法参见这里。

这里有个小技巧,如果使用了ui文件,我们可以将生成的ui头文件移动到cpp中,并将成员变量ui改为指针,.h文件中增加前置声明

namespace Ui
{class QtDesignerWidget;
};

以上操作是为了避免我们在include组件的头文件时,还必须包含ui头文件的麻烦。

在同一个项目中如果在多个类中都写了Q_PLUGIN_METADATA将报重定义错误,因为该宏实际上帮我们导出了两个符号:qt_plugin_instance和qt_plugin_query_metadata

如果要导出多个组件,我们需要QDesignerCustomWidgetCollectionInterface的帮忙。

导出多个自定义组件

在以上项目的基础上,我们新增一个类CustomWidgets,其声明与定义很简单,如下:

#include <QtUiPlugin/QDesignerCustomWidgetCollectionInterface>class CustomWidgets : public QObject, public QDesignerCustomWidgetCollectionInterface
{Q_OBJECTQ_PLUGIN_METADATA(IID "org.qt-project.Qt.QDesignerCustomWidgetCollectionInterface")Q_INTERFACES(QDesignerCustomWidgetCollectionInterface)public:CustomWidgets(QObject* parent = 0);QList<QDesignerCustomWidgetInterface*> customWidgets() const override;private:QList<QDesignerCustomWidgetInterface*> widgets;
};
#include "CustomWidgets.h"
#include "QtDesignerWidgetPlugin.h"
#include "QtWidgetsClassPlugin.h"CustomWidgets::CustomWidgets(QObject* parent): QObject(parent)
{widgets.append(new QtDesignerWidgetPlugin(this));widgets.append(new QtWidgetsClassPlugin(this));
}QList<QDesignerCustomWidgetInterface*> CustomWidgets::customWidgets() const
{return widgets;
}

QDesignerCustomWidgetCollectionInterface可以帮我们导出多个组件,我们只要在构造函数中new组件相应的plugin类即可。

我们可以再写一个组件,这两个组件的Q_PLUGIN_METADATA宏都必须去掉

这样重新生成项目,拷贝dll,再打开designer就可以看到两个自定义组件啦

如果想要在属性窗口中设置组件的属性,可以参考Q_PROPERTY宏,如下:

参考:

  1. https://doc.qt.io/qt-5/qdesignercustomwidgetinterface.html
  2. https://doc.qt.io/qt-5/qdesignercustomwidgetcollectioninterface.html
  3. https://doc.qt.io/qt-5/properties.html

Qt-QtDesigner插件编写相关推荐

  1. 在Qt中如何编写插件,加载插件和卸载插件

    Qt提供了一个类QPluginLoader来加载静态库和动态库,在Qt中,Qt把动态库和静态库都看成是一个插件,使用QPluginLoader来加载和卸载这些库.由于在开发项目的过程中,要开发一套插件 ...

  2. 20.QT中插件编程

    插件编程 插件可以理解为动态库,一种固定接口的动态库.以下摘自网友的理解.代码参考自官方示例. Qt插件本身是动态库,除此之外,它定义了一组专用的接口,从动态库中导出,供 Qt 的插件管理体系 发现和 ...

  3. Gulp:插件编写入门

    之前挖了个坑,准备写篇gulp插件编写入门的科普文,之后迟迟没有动笔,因为不知道该肿么讲清楚Stream这货,毕竟,gulp插件的实现不像grunt插件的实现那么直观. 好吧,于是决定单刀直入了.文中 ...

  4. VS2010插件编写学习总结

    VS2010 Addins 外接程序(插件)开发 http://www.cnblogs.com/Leo_wl/archive/2013/03/21/2973886.html 简单做了一个添加文件头注视 ...

  5. [Linux实用工具]munin-node插件配置和插件编写

    前面介绍了2篇munin使用的相关文章: [Linux实用工具]Linux监控工具munin的安装和配置 [Linux实用工具]Linux监控工具munin的展示(Nginx) 这次介绍一下munin ...

  6. Qt Creator添加Qt Designer插件

    Qt Creator添加Qt Designer插件 添加Qt Designer插件 查找Qt Designer插件 在macOS上配置Qt Designer插件 匹配的构建密钥 添加Qt Design ...

  7. Qt 使用代码编写的自定义控件类

    Qt 使用代码编写的自定义控件类 首先需要完成继承QWidget 或者Qt 原生控件类的类编写实现 在需要使用自定义控件类的 UI 文件中添加一个 自定义类的控件(也就是自定义类继承的控件) 将这个控 ...

  8. maven插件编写_编写Maven插件的提示

    maven插件编写 最近,我花了很多时间为Maven编写插件或在其中工作. 它们简单,有趣且有趣. 我以为我会分享一些技巧,使编写它们时的生活更轻松. 提示1:将任务与Mojo分开 最初,您将把moj ...

  9. 【转载】Nessus安全测试插件编写教程

    Nessus安全测试插件编写教程 作者:Renaud Deraison 翻译:nixe0n 1.怎样编写一个高效的Nessus安全测试插件 在Nessus安全测试系统中, 所有的安全测试都是由ness ...

  10. Soul网关源码阅读(十)自定义简单插件编写

    Soul网关源码阅读(十)自定义简单插件编写 简介     综合前面所分析的插件处理流程相关知识,此次我们来编写自定义的插件:统计请求在插件链中的经历时长 编写准备     首先我们先探究一下,一个P ...

最新文章

  1. c语言编译器_学C语言写自己的K语言:编译器词法分析。
  2. POJ2631 Roads in the North
  3. Hadoop辅助工具——Flume、Sqoop
  4. 安卓 camera 调用流程_安卓如何做出微信那样的界面仿微信“我”的界面1/5
  5. ACE总监侯圣文全面解析特训方法
  6. xxx is not mapped 错误 解决方案
  7. jdom解析xml文件_JDOM编辑XML文件示例
  8. 双显卡单独分辨率_显卡预算超低、除了二手,你还可以考虑它、肥猫RX560显卡 评测...
  9. linux主机ip数据包抓取,tcpdump和ngrep抓不到本机数据包
  10. 一周3篇顶刊!颜宁团队今年已发5篇Science/PNAS等顶级论文
  11. Atitit 异常处理之道 attilax著.docx 1. 概念 2 1.1. 异常机制的设计原理 2 1.2. Atitit.异常机制的设计原理.docx java 2 1.3. JVM看Exc
  12. 怎么才可以使用 IPX 协议???
  13. 关于iis中域名转向的问题
  14. 由KTT展开的一系列知识点
  15. 关于在 firefox 主页自定义背景可以用的图片
  16. 锦标赛选择法(遗传算法)
  17. 从C端市场延伸至B端业务拓展,流利说深耕行业英语价值几何?
  18. DCDC--Burst Mode和Pulse Skipping Mode
  19. 【转】王阳明:耐住寂寞,守得花开
  20. VS2019除出现许可证过期问题-无法下载许可证

热门文章

  1. html前端命名规则
  2. 数据库管理系统的基本组成
  3. 如何设置微信订阅号的微信号以及申请微信认证
  4. 详解K均值聚类算法(K-means Clustering)简易实例:从空调温度判别使用者
  5. 【python写一个AI对战五子棋游戏】
  6. linux下计算md5值,Linux下使用md5sum计算和检验MD5码
  7. 记录|斐讯K2拆机使用ttl刷入breed并刷入新固件
  8. 阿铭Linux_网站维护学习笔记20190415
  9. 转载:全志一些具体工作
  10. 39份AICon全球人工智能与机器学习技术大会 · 北京站2021(PPT汇总)