Qt關於顏色的雜談

2021-07-01 22:17:41 字數 3612 閱讀 1819

一般的屬於qwidget子類的一些控制項,可以直接使用樣式表,例如

label->setstylesheet("color:white");

qpalette類相當於對話方塊或是控制項的調色盤,它管理著控制項或窗體的所有顏色資訊,每個窗體或控制項都包含乙個qpalette物件,在顯示時按照它的qpalette物件中對各部分各狀態下的顏色的描述來進行繪製。就像油漆匠的油漆計畫,當要刷牆時,到計畫中去查一下牆需要刷成什麼顏色。採用這種方式可以很方便地對窗體的各種顏色資訊進行管理。

qpalette類有兩個基本的概念,乙個是colorgroup,另乙個是colorrole。

colorgroup指的是3中不同的狀態,包括一下幾種。qpalette::active:獲得焦點的狀態。qpalette::inactive:未獲得焦點的狀態。qpalette::disable:不可用狀態。通常情況下,active狀態與inactive狀態下顏色顯示是一致的,當然也可根據需要設定成不一樣的顏色

colorrole指的是顏色主題,即對窗體中不同部位顏色的分類,如qpalette::window是指背景色,qpalette::windowtext指的是前景色等。

qpalette::setcolor()函式對某個主題的顏色及狀態進行設定。

qpalette::setbrush()函式對顯示進行更改,這樣就有可能使用而不僅僅是單一的顏色來對主題進行填充了。

qpalette::setcolor(colorrole r,const qcolor &c);對某個主題顏色進行設定,並不區分狀態

qpalette::setcolor(colorgroup gr,colorrole r,const qcolor &c);對主題顏色進行設定的同時還區分了狀態。

***->setautofillbackground(true);

qpalette p=***->palette();

p.setcolor(qpalette::window,color);

***->setpalette(p);

qt之前版本中有關背景色設定的函式如setbackgroundcolor()或是前景色設定的函式如setforegroundcolor()在qt4中都被廢止,統一由qpalette類進行管理。

注意要先呼叫setautofillbackground(true)設定窗體自動填充背景。如:

ui->label->setautofillbackground(true); 

ui->label->setpalette(qcolor(list.at(1).toint(),list.at(2).toint(),list.at(3).toint(),list.at(4).toint()));

ui->label->setpalette(qt::blue);

qpalete::window,通常指視窗部件的背景色;

qpalette:windowtext,通常指視窗不見的前景色;

qpalette::base,指文字輸入視窗部件(比如qtextedit,qlinedit等)保利地產的背景色.//應該用這個的

qpalette::text,與qpalette::base一塊使用,指文字輸入視窗部件的盜夢空間前景色;

qpalette::button,指按鈕視窗部件的背景色;

qpalette::buttontext,指按鈕視窗部件的前景色

一. 背景刷成黑色,前景色設為白色。 方法一、paltette方式,經測試,該方法不會影響到其他控制項,推薦使用

qpalette bgpal = palette();

bgpal.setcolor (qpalette::background, qcolor (0, 0 , 0, 255));

(qpalette::background, qt::transparent);

bgpal.setcolor (qpalette::foreground, qcolor

(255,255,255,255)); setpalette (bgpal);

方法二、stylesheet方式 影響子控制項的方法是:

setstylesheet ("background-color: #000000;color: #ffffff;");

不影響子控制項的方法是:

setstylesheet ("venus--titlebar ");

二. 圓角控制項 用stylesheet方式

setstylesheet ("border:2px groove

gray;border-radius:10px;padding:2px 4px;");

三. 圓角視窗 roundrectwin::roundrectwin()

注意:mask的圖多餘部分設為白色

四. 半透明視窗

1.視窗整體透明,但是窗體上的控制項不透明。 通過設定窗體的背景色來實現,將背景色設定為全透。 qpalette pal =

palette();

pal.setcolor(qpalette::background,

qcolor(0x00,0xff,0x00,0x00)); setpalette(pal); 試驗效果:

窗體標題欄不透明;

窗體客戶區上的控制項不透明,qlabel控制項只是字顯示,控制項背景色透明; 窗體客戶區完全透明。

另外從網上看到的方法: setattribute(qt::wa_translucentbackground, true);

試驗的結果是類似於上面的方法,但有時候窗體會被一些雜色斑點填充,未找到原因。

2.視窗及其上面的控制項都半透明:

setwindowopacity(0.7)

試驗效果:視窗及控制項都半透明。注意不能夠setwindowflags(qt::framelesswindowhint);要不就不起作用

3.視窗整體不透明,區域性透明:

在paint事件中使用clear模式繪圖。

void testwindow::paintevent( qpaintevent* )

試驗效果:繪製區域全透明。如果繪製區域有控制項不會影響控制項。

以上實驗均是基於directfb的qte測試。在linux下及windows下效果會略有不同。

比如在windows下第3個實驗,繪製區域就是乙個黑窟窿,如果window本身半透,則是window下面的內容加上半透效果,不是全透明效果。

五. 控制qpixmap的alpha

qpixmap temp(pixmaptop.size()); temp.fill(qt::transparent);

qpainter p(&temp);

p.setcompositionmode(qpainter::compositionmode_source);

p.drawpixmap(0, 0, pixmaptop);

p.setcompositionmode(qpainter::compositionmode_destinationin);

p.fillrect(temp.rect(), qcolor(0, 0, 0, alpha));

//--lable顯示前景 ui->label->setscaledcontents(true);

ui->label->setpixmap(temp);

六. layout 的邊界 layout->setmargin (0);

QT 關於顏色的總結

一般的屬於qwidget子類的一些控制項,可以直接使用樣式表,例如 label setstylesheet color white qpalette類相當於對話方塊或是控制項的調色盤,它管理著控制項或窗體的所有顏色資訊,每個窗體或控制項都包含乙個qpalette物件,在顯示時按照它的qpalette...

qt開發雜談

1 qt中訊號和槽有一種自動連線方式 void on 如果槽的命名是這樣的話 void on 就會自動將widget name中的訊號signal name和這個槽void on 鏈結起來。例如 void on okbutton clicked 系統就會自動將okbutton類中的訊號clicked...

qt程式設計問題雜談

1 乙個訊號可以連線多個槽,觸發一次訊號就發起了多個槽操作。2 qt下兩個執行緒之間可以用訊號和槽傳遞資料,但是當乙個執行緒一直迴圈執行,等待另乙個執行緒發來的資料的時候,當另乙個執行緒觸發了這個訊號時,如果這個執行緒一直輪循,其實屬於此執行緒的這個槽函式是不會被觸發的。3 qt下實現執行緒的函式是...