程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Qt Designer中自定義控件的使用(提升法與插件法)

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

編輯:關於C語言

  • 准備亂寫一點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簡簡單單,我的小屋...

  •  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved