1.需要创建一个合适的.pro文件

2.创建一个继承QDesignerCustomWidgetInterface的类,描述控件的一些属性.

函数 描述和返回值
name() 指定控件的名称
group() 控件所属的类别
toolTip() 关于控件的简短描述
whatsThis() 关于控件的详细描述
includeFile() 控件使用时必须包含的头文件
icon() 控件在QTDesigner控件框中显示的图标
isContainer() 如果可以包含子控件为真,否则为假
createWidget() 创建控件指针,不过属性不可获得,除非load()加载完成
domXml() 描述控件的属性
codeTemplate() 保留函数

另外还有两个虚函数需要被重新实现.

initialize() 设置自定义控件的扩展,自定义容器和菜单需要设置这个函数
isInitialized() 如果控件被初始化,返回真,否则返回假

3.domXml()函数

domXml()会返回一个UI文件,这个文件被Qt用来创建一个自定义的控件.并包含了控件的相关参数

Qt4.4版本之后,Qt Designer的控件盒子允许使用完整的UI文件描述一个自定义控件.UI文件使用<ui>标签加载,特别是<ui>标签允许添加<customwidget>元素来包含自定义控件的额外信息.当然,如果没有额外信息需要添加,使用标签<widget>已经足够.

如果自定义控件没有提供合适的大小尺寸.必须指定通过类函数domXml()返回的UI数据流中的geometry几何默认大小

关于domXml()函数另一种情况是,这个函数返回一个空的字符串,这个控件不会再Qt Designer显示框中显示出来,但仍然可以被其他窗口控件所使用,这种情况一般适用于隐藏的窗口,

一个完整的自定义控件的设置:

<ui language="c++"> displayname="MyWidget">
<widget class="widgets::MyWidget" name="mywidget"/>
<customwidgets>
<customwidget>
<class>widgets::MyWidget</class>
<addpagemethod>addPage</addpagemethod>
<propertyspecifications>
<stringpropertyspecification name="fileName" notr="true" type="singleline"/>
<stringpropertyspecification name="text" type="richtext"/>
<tooltip name="text">Explanatory text to be shown in Property Editor</tooltip>
</propertyspecifications>
</customwidget>
</customwidgets>
</ui>

一个完整的自定义控件形式

<ui>标签的属性

属性   形式 说明
 language 可选择的 "c++","jambi" 指定了自定义界面推荐使用的语言
displayname 可选择的 类名 这个值出现在QT控件显示框中或脱离命名控件域

<addpagemethod>标签告诉Designer或uic,他应该被增加到一个容器控件中.这个主要应用于容器控件,

<propertyspecifications>标签元素可以包含一系列属性元数据信息.

<tooltip>标签用来显示在属性编辑框中鼠标放在属性上显示的信息.

对于一些字符串类型的属性,可以使用<stringpropertyspecification>标签.他的相关属性有:

属性 是否需求 说明
name 需要 属性的名称  
type 需要 见下表 所用的值定义了属性编辑器如何操作他们
notr 可选择的 "true"或"false" 如果值为真,值不会被翻译

type属性的值和描述:

类型
"richtext" 富文本
"multiline" 多行源码文本
"singleline" 单行源码文本
"stylesheet" css文本
"objectname" 对象名称
"url" URL,文本名称

插件需求:

为了插件在所有平台都能正常工作,需要确保导出至Qt指定的形式.

首先,插件类必须导出成能被Qt Designer加载的插件.通过Q_PLUGIN_METADATA()宏来实现,并且,QDESIGNER_WIDGET_EXPORT()宏必须用来定义每一个在插件中的自定义控件类,这样Qt Designer才能加载他.

创建良好行为的控件

一些自定义控件含有着特殊的用户接口,这使得他提供了标准控件不一样的行为.

建立和加载插件

插件的.pro文件必须指出自定义控件和插件接口相关的头文件和cpp文件,通常,文件必须指明工程是一个插件库,通常设置如下:

QT          += widgets uiplugin
CONFIG += plugin
TEMPLATE = lib

QT参数含有uiplugin,他表示插件使用抽象接口 QDesignerCustomWidgetInterface和 QDesignerCustomWidgetCollectionInterface并且没有连接到Qt Designer库.如果连接了其他Qt Designer接口,designer也应该在QT参数中添加.目前这样的配法是确保插件动态的连接Qt Designer库,并且在运行期间加载他们.

如果插件使用Qt Designer不相容的模式,插件将无法被加载和初始化.

为了确保插件同Qt Desinger插件安装在一起,使用下列配置:

target.path   = $$[QT_INSTALL_PLUGINS]/designer
INSTALLS += target

真实案例中,控件的头文件和cpp文件不应该同应用程序的文件有太多的依赖关系.下面我们将提供一些方法

自定义控件的资源和头文件可以在应用程序和Qt Designer之间使用pri文件共享:

INCLUDEPATH   += $$ PWD
HEADERS += $$ PWD/analogclock.h
SOURCES += $$ PWD/analogclock.cpp

这个pri文件 文件将在插件和应用的pro文件中包含:

include(customwidget.pri)

  使用一个库共享控件

另一种方法是将控件放在一个库文件中,然后库文件连接到QT Designer插件,这种方法被推荐在使用静态库文件来避免运行期间加载库文件出现的问题.

使用QUiLoader使用插件

这是一个首选的方法,用于使用QUiLoader的子类,重载QUiLoader::createWidget()方法.

然而,仍然可以使用QtDesigner自定义控件插件,为了避免在目标设备上安装Qt Desinger库,这些插件不能和QtDesinger库存在连接关系.即在pro中QT = uiplugin.不能含有designer

Qt 创建一个QtDesinger第三方控件的更多相关文章

  1. MFC小程序003------MFC使用WebBrowser组件,在对话框中创建滚动视图,动态创建一个静态文本控件并设置鼠标单击的消息响应

    MFC小程序截图: 一.在MFC中简单使用WebBrowser的ActiveX插件的方法: 见博文:  http://blog.csdn.net/supermanking/article/detail ...

  2. 【VS开发】使用MFC创建并调用ActiveX控件

    使用MFC创建并调用ActiveX控件 今天做了一下ActiveX的使用测试,总结一下: 首先使用MFC创建一个activeX的控件譬如ActiveXTest,编译成ocx并注册,然后另外编写一个测试 ...

  3. Qt SizePolicy 属性(每个控件都有一个合理的缺省sizePolicy。QWidget.size()默认返回值是(640, 480),QWidget.sizeHint()默认返回值是(-1, -1))

    控件的sizePolicy说明控件在布局管理中的缩放方式.Qt提供的控件都有一个合理的缺省sizePolicy,但是这个缺省值有时不能适合 所有的布局,开发人员经常需要改变窗体上的某些控件的sizeP ...

  4. 教程-Delphi第三方控件安装卸载指南

    1 只有一个DCU文件的组件.DCU文件是编译好的单元文件,这样的组件是作者不想把源码公布.一般来说,作者必须说明此组件适合Delphi的哪种版本,如果版本不对,在安装时就会出现错误.也正是因为没有源 ...

  5. 如何用 Swift 语言构建一个自定控件

    (via:破船之家,原文:How To Make a Custom Control in Swift)   用户界面控件是所有应用程序重要的组成部分之一.它们以图形组件的方式呈现给用户,用户可以通过它 ...

  6. Ionic2中集成第三方控件Sweetalert

    Ionic2混合开发,入坑系列:Ionic2中集成第三方控件Sweetalert 注:Sweetalert2已经可以直接从npm中下载安装 npm install --save sweetalert2 ...

  7. ActiveReports 报表应用教程 (13)---嵌入第三方控件

    葡萄城ActiveReports报表与Visual Studio完美集成,给我们带来更为灵活易用的报表定制和自定义控件嵌入支持,除了可以在报表中使用葡萄城ActiveReports报表内置控件外,您还 ...

  8. WPF第三方控件盘点

    WPF统一的编程模型.语言和框架,实现了界面设计人员和开发人员工作可以分离的境界,鉴于WPF强大的优势,且一直是开发者关注的地方,下面和大家分享基于WPF项目开发需要用到的第三方控件,包括业界最受好评 ...

  9. Qt QTableView 表格内添加控件

    目录 Qt QTableView 表格内添加控件 1. QItemDelegate 2. setIndexWidget 3. setIndexWidget + setLayout Qt QTableV ...

随机推荐

  1. js中的写出想jquery中的函数一样调用

    1.IIFE: Immediately-Invoked function Expression 函数模块自调用 2.代码实现 <!DOCTYPE html> <html lang=& ...

  2. Activiti 中的ACT_RU_TASK表中的EXECUTION_ID和PROC_INST_ID区别

    当你的流程图为单向的时候则EXECUTION_ID和PROC_INST_ID是一样的 这种的流程图的话是一样的 这种的话就到支流是不一样的由于在节点处进行了分支,导致这个有三个方案.导致里面的分支分离 ...

  3. Python基础——for/while循环

    Python版本:3.6.2  操作系统:Windows  作者:SmallWZQ 上学期间,常常遇到这样的情景:为了惩罚学生,老师会说:"XXX,你先去操场上跑10圈再回来继续反省.&qu ...

  4. Git (gnome-ssh-askpass:3871): Gtk-WARNING **: cannot open display:

    在使用Git在客户端使用git push 命令提交文件到github时,出现报错 (gnome-ssh-askpass:): Gtk-WARNING **: cannot open display: ...

  5. LeetCode第四天

    leetcode 第四天 2018年1月4日 15.(628)Maximum Product of Three Numbers JAVA class Solution { public int max ...

  6. PAT1078 Hashing 坑爹

    思路:用筛法给素数打表,二次探测法(只需要增加的)–如果的位置被占,那么就依次探测. 注意:如果输入的,这也不是素数:如果,你需要打表的范围就更大了,因为不是素数. AC代码 #include < ...

  7. 分享一个Appium/selenium测试报告模板

    介绍 这个模板改编自 这位外国老哥 效果图 错误截图 录像 失败的case可以点击"view"查看报错信息, 也可以点击screenshot查看截图信息,更可以点击replay查看 ...

  8. JQuery基础知识学习1

    1.JQuery是javascript的类库 2.下载JQuery 3.导入JQuery <script src="jquery-3.0.0.js"></scri ...

  9. 【Unity3D】Unity3D 摄像机带透明截图

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/CropCamera.html ↓↓↓下面的废话可以不看↓↓↓ 最近处理了一批我的游戏的图标,步骤特别繁琐, 需要先 ...

  10. The Windows account sa does not exist and cannot be provisioned as a SQL Server system administrator

    今天遇到一个案例,在使用命令修改一个测试服务器(SQL Server 2014标准版)的服务器排序规则时,遇到了下面错误信息 (具体账号信息脱敏处理,随机生成一个账号密码) The Windows a ...