Qt 创建一个QtDesinger第三方控件
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