轉載自http://blog.csdn.net/nrc_douningbo/article/details/5571187
設置一個widget的背景圖片/顏色,我們可以使用調色板QPalette,而設置最重要的就是setBrush()畫刷。剛google搜索了一下,發現用setBrush基本都只用了它的一種方法,但實際上其有兩種用法。
QPalette palette;
用法一:palette.setBrush(QPalette::Base, brush);
palette1.setBrush(QPalette::Active, QPalette::Base, brush);
上述兩種方式大同小異,除去group這一參數歪,其餘兩個參數一模一樣,其中第二個參數代表顏色角色!
其主要通過枚舉變量QPalette::ColorRole來定義,常用的枚舉值有:
QPalete::Window,通常指窗口部件的背景色;
QPalette:WindowText,通常指窗口不見的前景色;
QPalette::Base,指文本輸入窗口部件(比如QtextEdit,QLinedit等)的背景色.
QPalette::Text,與QPalette::Base一塊使用,指文本輸入窗口部件的前景色;
QPalette::Button,指按鈕窗口部件的背景色;
QPalette::ButtonText,指按鈕窗口部件的前景色.
(上段枚舉引用自博文:http://hi.baidu.com/tpxc/blog/item/4e7c72277682ba09918f9da8.html
從上邊這些枚舉變量可知:針對不同的Qt控件,當我們用QPalette設置其背景/前景顏色時:需要指定不同的顏色角色參數!
比如:對於QTextEdit,設置其背景時要使用QPalette::Base ; 對於QWidget則使用QPalette::Window 。如果指定錯了,則這個調色板的使用會不生效!!
(我用QPalette::Button來設置一個QPushButton的背景,卻一直不能生效,誰可以告訴我原因還是系統BUG?)
用法二: palette.setBrush(ptr->backgroundRole(),brush())
此時第一個參數直接取某一個窗口的顏色角色,而不是人爲的去設置!用這種方式的好處在於:不用去考慮哪種控件該用哪個角色參數,這樣避免出錯! 但是這裏有一個很重要的問題需要去注意:對於QTextEdit的背景角色,按照上邊所說應該是QPalette::Base這個枚舉值,其value爲9。 但是當我們隊QTextEdit控件調用backgrounRole()返回其角色值時:卻發現這個值爲10.顯然二者不對應,但是對於QPushButton卻是對應的! 對於這一點我感到很困惑!但是卻一直沒找到合理的解釋,只有一種可能,那就是:這是一個系統BUG !
所以上邊提示我們:當用QPalette調色板來設置QTextEdit這個控件的背景顏色時:不要調用其自己的backgrounRole()來設置顏色角色,而應該自己手動設置成QPalette::Base !切記切記!!!!
===============================================================================
那轉回到QGraphicsWidget體系中QTextEdit背景顏色的設置上來:
我們將一個QWidget或其子類的控件用addWidget加入到到scene場景中時,我們可以認爲其做了兩步:
首先:其建了一個代理item窗口,並將這個QWidget控件放到這個代理item窗口中去!
而後:它再講這個代理item像常規那樣放到scene場景中!!!
所以:當將一個QTextEdit放到scene場景中後,我們可以認爲其前後有三層:最底下一層是場景所在的view,中間一層是代理item窗口,最上邊一層纔是真正的QTextEdit編輯框。 那麼:要想讓編輯框透明,看到view這一層,則不僅僅需要將QTextEdit本身設置爲背景透明,而且還要將其所在的代理item窗口也設置爲背景透明!
將QTextEdit設置爲背景透明就用QPalette::Base爲參來設置即可!而對於代理item窗口,其背景顏色角色枚舉值爲:QPalette::Window (這個是我挨個試出來的,畢竟代理Item窗口QGraphicsProxyWidget類沒有backgroundRole()函數 )。
總結:QPalette雖然很好用,但是其中存在諸多問題,而且對於一些特殊情況:幫助文檔上也沒有給出說明,這些如若不注意都會出現很多問題。