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