摘自:
要想在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」標頭檔案而不是,還包含了乙個hexspinbox的例項,而不是qspinbox。在qt designer中,hexspinbox控制項由qspinbox表示,並且可以設定所有的qspinbox的屬性(如範圍、當前值)。
公升級法的缺點是不能在qt designer中設定自定義控制項自己的特有屬性,也不能夠繪製自己。這些問題可以用外掛程式法解決。
外掛程式法需要建立乙個外掛程式庫,使qt designer能夠實時載入,用來建立控制項的例項。這樣,qt designer就可以在編輯窗體或者預覽的時候使用自定義控制項。因為有了qt的meta-object系統,qt designer能動態獲得自定義控制項的全部屬性。現在以iconeditor為例,用外掛程式法把iconeditor整合到qt designer中。
首先,我們從qdesignercustomwidgetinte***ce派生乙個新類,重寫一些虛函式。我們假定這個外掛程式的源**在iconeditorplugin目錄中,iconeditor類的**在與它平行的目錄iconeditor中。
這裡是外掛程式類的定義:
#include
class iconeditorplugin : public qobject, public qdesignercustomwidgetinte***ce
;
iconeditorplugin類是乙個封裝了iconeditor控制項的工廠類,它使用了雙繼承,父類為qobject和qdesignercustomwidgetinte***ce。巨集q_inte***ces()告訴moc第二個基類為乙個外掛程式介面類。qt designer使用該類中的函式建立iconeditor的例項並得到有關它的資訊。
原始檔如下:
iconeditorplugin::iconeditorplugin(qobject *parent)
: qobject(parent)
qstring iconeditorplugin::name() const
qstring iconeditorplugin::includefile() const
qstring iconeditorplugin::group() const
qicon iconeditorplugin::icon() const
qstring iconeditorplugin::tooltip() const
qstring iconeditorplugin::whatsthis() const
bool iconeditorplugin::iscontainer() const
qwidget *iconeditorplugin::createwidget(qwidget *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 = lib
config += designer plugin release
headers = ../iconeditor/iconeditor.h /
iconeditorplugin.h
sources = ../iconeditor/iconeditor.cpp /
iconeditorplugin.cpp
resources = iconeditorplugin.qrc
destdir = $(qtdir)/plugins/designer
.pro檔案假定環境變數qtdir位於qt的安裝目錄。在執行make或者nmake編譯外掛程式後,程式自動它安裝到qt designer的plugins目錄中。安裝成功後,我們就能象其他控制項一樣在qt designer中使用iconeditor控制項了。
如果想在qt designer整合多個自定義控制項,你可以為每個控制項建立乙個的外掛程式,也可以把所有控制項組合到乙個外掛程式中,從qdesignercustomwidgetcollectioninte***ce派生。
自定義控制項 二 安裝整合自定義的控制項
本章介紹如何把前一章建立的控制項安裝整合到qtcreator中,使得自己編寫的控制項也能像普通控制項一樣使用。把上一章編譯生成的hlabelplugin.dll libhlabelplugin.a 複製到c qt 4.8.2 plugins designer 即qtsdk的安裝目錄 中,重新開啟qt...
自定義控制項 自定義鐘錶
private context mcontext 畫筆 private paint mpaint 控制項的寬 private int mwidth x方向的圓心座標 private int center 鐘錶的半徑 private int mradio 圓環的寬 private int stroke...
自定義控制項
首先是以下這幾項,attribute defaultproperty指定元件的預設屬性,toolboxdata指定當從ide工具中的 工具箱中拖動自定義控制項時為它生成的預設標記 defaultproperty text toolboxdata mycontrol runat server 上面這些...