QPalette類用于控制控件的風格,即任意一個地方的繪制方式。每個控件或者說qwidget對象內部都有一個QPalette對象。
在paintEvent(QPaintEvent *event)函數中,其實就是調用該控件的QPalette內容來進行繪制的了。
例如:
QStyleOptionTab opt;
opt.palette.setColor(QPalette::Button, mColors[wid]);
painter.drawControl(QStyle::CE_TabBarTabShape, opt);
調色板QPalette類包含了部件各種狀態的顏色組(ColorGroup)以及顏色角色(ColorRole)兩個屬性。
顏色組:一個調色板包含3種狀態:激活(Active),失效(Disabled)和非激活(Inactive)。Qt中的所有部件都包含一個調色板,并且使用各自的調色板來繪制它們自身,這樣可以使用戶界面更容易配置,也更容易保持一致。
顏色角色:用來指定該顏色所起的作用,如背景顏色或者是文本顏色等,主要的顏色角色如表所列。
只要分別設置好了這兩方面,那么該控件的繪制風格顏色也就確定了。
注:QPalette::Base一般也用作背景色。具體不知道一個控件哪部分屬于什么角色,就在設計師界面中,選中mainwindow,屬性表格中設置palette,改變調色板,自己每個顏色調整一下,看看效果就知道了。
此外,這個palette默認是子對象繼承父對象的,即只要mainwindow設置了比如palette中背景色為黑色,文本顏色為白色,那么整個軟件都是這種風格了,這也就是軟件實現多個風格切換設置的原理。此外,qt提供了一些風格可以選擇,fusion,windows,winxp,等等,可以直接用的。
參考博客:Qt-風格化_qt setstyle_Half-up的博客-CSDN博客
注:QTabBar的背景色設置中,其角色為QPalette::Button。
所以,想要實現qtabwidget的每個標簽頁顯示不同的背景色,因為該控件乃至它的子控件QTabBar都沒有提供修改標簽頁背景色的接口(因為QTabBar是一個widget,但是它的每個標簽頁卻不是,而是直接畫出來的,所以沒有接口),所以需要我們在QTabBar的paintEvent函數里自己去畫出來。關于這個可以參考這個博客:c++ - Qt TabWidget Each tab Title Background Color - Stack Overflow
這里需要注意的是,需要明確設置該tabbar控件的風格為fusion,才能生效,如下:
setStyle(QStyleFactory::create("fusion")); ? ?