把自訂控制項整合到Qt Designer中(Integrating Custom Widgets with Qt Designer(轉)要想在Qt Designer中使用自訂控制項,必須要使Qt Designer能夠知道我們的自訂控制項的存在。有兩種方法可以把新自訂控制項的語音總機給Qt Designer:“升級(promotion)”法和外掛程式法。升級法最為簡便快捷。顧名思義,升級法就是把Qt自有的控制項進行升級改造一番。選一個Qt自有的控制項,如果它和我們新加的自訂控制項有著相似的
API,那麼只要在Qt Designer的對話方塊裡面完成有關新控制項的資訊就一切大吉,新控制項就可以用在Qt
Designer建立的form中。但是在編輯和預覽時,還是和Qt自有控制項表示沒有什麼兩樣。現在把HexSpinBox控制項用升級方法插入到一個form中:1.
用Qt Designer建立一個新的表單,把控制項箱裡的QSpinBox添加到表單中。2.
右擊spin box,選擇“Promote to Custom Widget”操作功能表。3.
在彈出的對話方塊中,類名處填寫“HexSpinBox”,標頭檔填寫“hexspinbox.h”好了。在uic產生的程式碼中包含有“hexspinbox.h”標頭檔而不是<QSpinBox>,還包含了一個
HexSpinBox的執行個體,而不是QSpinBox。在Qt Designer中,HexSpinBox控制項由QSpinBox表示,並且可以設定所有的QSpinBox的屬性(如範圍、當前值)。
Figure 5.6. Qt Designer's custom widget dialog
升級法的缺點是不能在Qt Designer中設定自訂控制項自己的特有屬性,也不能夠繪製自己。這些問題可以用外掛程式法解決。外掛程式法需要建立一個外掛程式庫,使Qt Designer能夠即時載入,用來建立控制項的執行個體。這樣,Qt
Designer就可以在編輯表單或者預覽的時候使用自訂控制項。因為有了Qt的meta-object系統,Qt
Designer能動態獲得自訂控制項的全部屬性。現在以IconEditor為例,用外掛程式法把IconEditor整合到Qt Designer中。首先,我們從QDesignerCustomWidgetInterface派生一個新類,重寫一些虛函數。我們假定這個外掛程式的原始碼在iconeditorplugin目錄中,IconEditor類的代碼在與它平行的目錄iconeditor中。這裡是外掛程式類的定義:#include
<
QDesignerCustomWidgetInterface
>
class
IconEditorPlugin :
public
QObject,
public
QDesignerCustomWidgetInterface
{
Q_OBJECT
Q_INTERFACES(QDesignerCustomWidgetInterface)
public
:
IconEditorPlugin(QObject
*
parent
=
0
);
QString name()
const
;
QString includeFile()
const
;
QString group()
const
;
QIcon icon()
const
;
QString toolTip()
const
;
QString whatsThis()
const
;
bool
isContainer()
const
;
QWidget
*
createWidget(QWidget
*
parent);
};
IconEditorPlugin類是一個封裝了IconEditor控制項的工廠類,它使用了雙繼承,父類為QObject和
QDesignerCustomWidgetInterface。宏Q_INTERFACES()告訴moc第二個基類為一個外掛程式介面類。Qt
Designer使用該類中的函數建立IconEditor的執行個體並得到有關它的資訊。源檔案如下:IconEditorPlugin::IconEditorPlugin(QObject
*
parent)
: QObject(parent)
{
}
QString IconEditorPlugin::name()
const
{
return
"
IconEditor
"
;
}
QString IconEditorPlugin::includeFile()
const
{
return
"
iconeditor.h
"
;
}
QString IconEditorPlugin::group()
const
{
return
tr(
"
Image Manipulation Widgets
"
);
}
QIcon IconEditorPlugin::icon()
const
{
return
QIcon(
"
:/images/iconeditor.png
"
);
}
QString IconEditorPlugin::toolTip()
const
{
return
tr(
"
An icon editor widget
"
);
}
QString IconEditorPlugin::whatsThis()
const
{
return
tr(
"
This widget is presented in Chapter 5 of <i>C++ GUI
"
"
Programming with Qt 4</i> as an example of a custom Qt
"
"
widget.
"
);
}
bool
IconEditorPlugin::isContainer()
const
{
return
false
;
}
QWidget
*
IconEditorPlugin::createWidget(QWidget
*
parent)
{
return
new
IconEditor(parent);
}
Q_EXPORT_PLUGIN2(iconeditorplugin, IconEditorPlugin)
建構函式是一個空函數。函數name()返回外掛程式提供的控制項的名稱。函數includeFile()得到外掛程式封裝的特定控制項的標頭檔,這個標頭檔包含在uic工具產生的代碼中。函數group()返回的是該自訂控制項所屬的工具箱(box group)的名字。如果Qt Designer中沒有這個名字,就會為這個控制項建立一個新的組別。函數icon()返回自訂控制項在Qt Designer中使用的表徵圖。這裡我們假設IconEditorPlugin有關聯的資源檔,裡面有一個表徵圖編輯器映像的介面。函數toolTip()
完成在Qt Designer的控制項箱中,當滑鼠移動到自訂控制項時,顯示字串做為提示。函數whatsThis()返回Qt Designer顯示的“What’s This”提問。函數isContainer()返回true說明這個控制項可以包含其他控制項。例如,QFrame可以包含其他控制項,則它是一個容器控制項。很多
Qt控制項都可以包含其他控制項,但是如果isContainer()返回false,Qt Designer就不允許這個控制項包含其他控制項了。Qt Designer調用函數createWidget()建立指定父控制項的控制項執行個體。宏Q_EXPORT_PLUGIN2()
必須在源檔案的最後聲明,這個宏使Qt Designer能夠得到這個外掛程式。第一個參數是這個外掛程式的名字,第二個參數是實現這個外掛程式類的名字。.pro檔案如下:TEMPLATE = libCONFIG += designer plugin releaseHEADERS = ../iconeditor/iconeditor.h / iconeditorplugin.hSOURCES = ../iconeditor/iconeditor.cpp / iconeditorplugin.cppRESOURCES = iconeditorplugin.qrcDESTDIR = $(QTDIR)/plugins/designer.pro檔案假定環境變數QTDIR
位於Qt的安裝目錄。在運行make或者nmake編譯外掛程式後,程式自動它安裝到Qt Designer的plugins
目錄中。安裝成功後,我們就能象其他控制項一樣在Qt Designer中使用IconEditor
控制項
了。
如果想在
Qt Designer
整合多個自訂控制項,你可以為每個控制項建立一個的外掛程式,也可以把所有控制群組合到一個外掛程式中,從
QDesignerCustomWidgetCollectionInterface
派生。