QT 樣式風格(Style Mechanism)
作者:劉旭晖 Raymond 轉載請注明出處
Email:[email protected]
BLOG:http://blog.csdn.net/colorant/
QT Style的機制和GTK的Style機制很類似,基本上就是
- 定義了一個基礎的Style類,在Style類裡面定義一系列的繪圖相關函數接口,具體風格的Style類實作了這些函數接口。
- 在控件的實作中,控件的繪圖函數調用Style類的繪圖函數接口,繪制具體的控件UI
- 通過使用不同的Style實作,實作全局UI風格的改變
所不同的是這些函數的的顆粒度、分類及複雜程度。此外各種局部風格調整的機制,思路也是一緻的,隻是在具體實作上有不同的Approach
QStyle主要函數
QStyle類提供的功能主要包括提供标準的繪圖函數和一些輔助函數
繪圖類函數
QStyle類将UI的組成元素分為三類
- Primitive Elements : 基本元素,一些基本的,被多個控件所複用的元素,如邊框,倒角,箭頭等(注意這裡的基本元素的概念,和點,線等繪圖基本元素的概念不同)。基本元素本身不能單獨純在。
- Control Elements : 控件元素,如按鍵,複選框等,不單是這些單獨的控件,也包括複雜控件中的組成元素,如滾動條中的滑塊。它和基本元素不同的地方是,它能夠單獨處理使用者互動操作。
- Complex Contro Elements : 複雜控件元素,複雜控件元素包含有子控件元素。例如combo boxes(複合選擇框)等。它的使用者互動響應,取決于使用者操作的對象是哪個子控件。
是以,對應的有三個函數用于繪制這三類UI元素。因為不同的控件對各自的UI有不同的要求,具體控件在繪制自己的UI的時候,調用這些函數是,所需要的參數也會有不同,是以這三類函數基本都需要傳參指定:
- 繪制元素的類型
- 該類型對應的具體參數(用類的方式傳遞,基本上繪制不同的元素都需要傳遞自己特定的參數類(QStyleOption的子類))
- 用于具體繪圖的QPainter類
- 控件本身(可選)
理論上說,傳遞一個控件對象本身,就應該包含它繪圖時所需要的參數,但是傳遞QStyleOption來指定參數也有好處,就是任何控件都可以繪制任意所需要的UI元素,不一定隻有按鍵控件才能傳參來繪制按鍵UI
輔助類函數
輔助類的函數,這裡列舉一部分:
- 一組用來傳回文本或子元素的邊界矩形(Bounding Rect)的函數,用來擷取對應元素的邊界資訊
- 用來提供符合特定GUI風格标準的圖示位圖的函數
- 用來擷取一些風格相關尺寸資訊(比如預設邊框寬度,按鍵間距等等)的函數
- 擷取Style标準調色闆的函數
調色闆
每個具體的Style類都會傳回一個Palette調色闆類,用分組的方式(ColorGroup)定義控件在不同狀态下(Disabled/Active/Inactive/Normal)的各類顔色(QColor)/畫筆(QBrush)資訊。在一組的顔色畫筆資訊中,進一步以角色(ColorRole)的形式進行檢索。
舉例來說,你可以指定 例如 Active狀态(group)下按鍵文本(ColorRole)來擷取對應的顔色/畫筆資訊
Style和Painter
在Style類内部,最終還是調用Painter的畫圖函數來執行具體的畫圖動作,是以同一個Style對應不同的Painter,最終顯示效果可能會有不同
Style Awareness的控件/程式
通常來說,編寫應用程式的時候,除非對應用程式的外觀有特定的要求。否則,為了能讓QT應用程式的外觀能夠在各種平台和風格設定的情況下都能最大程度的相容系統設定,不應該在代碼中強制指定例如顔色,字型等等外觀相關的參數。
而如果對應用程式的外觀有特定的要求,也應該盡量通過Style相關的方式來支援,例如繼承定制自己的Style,或者用Style-sheet在目前Style的基礎上,修改部分UI風格。
在實作定制的控件的時候,也應該盡量使用Style相關繪圖函數來繪制控件外觀,而不是直接用各類繪圖函數繪制固定的外觀。
設定Style
- 你可以通過 QApplication::setStyle 或者 QWidget::setStyle 函數設定整個函數或者單個控件要使用的Style
- 你也可以通過 -style stylename 指令行參數指定應用程式要使用的UI風格
./application -style motif