准備亂寫一點Qt自定義Widget在Designer中的使用。可是又不想重復提升法(promotion)及插件法基本用法,因為Manual中Using Custom Widgets with Qt Designer已經說的很清楚了。
使用designer
Qt用戶可能會經歷這樣的3個階段:
剛接觸Qt,在designer中拖拖拽拽,一個界面就形成了。相當方便(不過不少人網友初次接觸時對layout相當不適應)
比較熟悉之後,感覺designer是個累贅,比如:
感覺在designer中拖拽控件,完全沒有在代碼中寫的易於控制。盡管都是用QLayout
接觸到自定義控件後,發現在designer中使用自定義控件比較麻煩。
就是不太喜歡desinger生成.ui文件,然後uic生成 ui_xxx.h文件的這套東西。
...
再過一段時間,發覺,designer確實很方便。而且通過提升法在designer中使用自定義控件是非常簡單的。而且前一階段的問題其實也都不算什麼問題。
自定義控件
考慮下列情況:
從QWidget派生了一個led燈控件:HLed
從QSpinBox派生了一個進制可變的:HBaseSpinBox
從QLabel派生了一個發射但雙擊信號的:HLabel
...
恩,沒什麼特別的哈
如果在代碼中使用的話,包含頭文件直接用即可。和標准控件沒有任何區別。
如果在designer中使用,分別拖放QWidget、QSpinBox、QLabel,然後右鍵點擊提升...
提升 vs 插件
兩種方法有什麼區別麼?什麼區別?
先考慮我們是如何使用designer的(此處不考慮.ui動態加載):
打開designer,拖放控件,應用布局,設置屬性
保存,生成 XXX.ui 文件
調用 uic 將 XXX.ui 預處理成 ui_XXX.h
調用C++編譯器編譯這些 *.h、*.cpp
注意,如果你寫了插件,那麼它只在第一步中有用。有什麼用:
插件包含類名name()已經頭文件includeFile()信息。(對比,用提升法時,手動輸入這兩項信息)
插件包含控件的實現
所以在designer中可以看到控件的真實樣子。(對比,提升法時,需要一個替身,一般就是其基類)
可以感知其有哪些屬性,並顯示在屬性編輯器中。(對比,你可以直接在屬性編輯器中添加屬性,又一個大大的加號,不是麼?)
...
歸根到底,插件法 和 提升法想比,其實沒有本質的區別。二者都是要生成一個.ui文件,而這個文件的使用,和插件一點關系都沒有。
還有點什麼...
前面的東西都似乎沒什麼意思,因為Manual中介紹很清楚,只要用過提升法和插件法就能得出上面這些的東西。
可是,還有有一點可能稍微有點意思,考慮:
我從QStackedWidget派生類了一個HDoubleSpinBox。可是在designer中,我想看到一個QDoubleSpinBox,而不是一個stacked widget.
我從QLabel派生了一個HLabelButton。可是在designer中,我想看到一個QToolButton,而不是一個 QLabel
...
插件法能不能做到?
能,只要讓插件的createWidget()創建一個QDoubleSpinBox或者QToolButton
提升法能不能做到?
能,注意到提升時我們我們需要選擇一個基類。而這個基類,我們可以隨便選,選擇哪一個,哪一個就會作為替身顯示出來。
(注意:本文中忽略了很多細節,希望不會造成誤導...)
摘自:1+1=2簡簡單單,我的小屋...