Qt Designer中自定義控件的使用(提升法與插件法)


准備亂寫一點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

提升法能不能做到?

能,注意到提升時我們我們需要選擇一個基類。而這個基類,我們可以隨便選,選擇哪一個,哪一個就會作為替身顯示出來。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM