Qt 設定視窗背景

2021-10-17 05:26:09 字數 1976 閱讀 1415

環境: qt6.0

參考:

qt 設定視窗背景有三種方式:

使用 qpalette 設定背景

實現 paintevent, 使用 qpainter 繪製背景

使用 qss 設定。

其中,使用 qss 設定視窗背景容易出現問題,原因是口使用qss設定背景之後,若子部件不使用同樣的方式來設定,預設則會繼承父視窗的樣式。一開始我也是用 qss 設定的,這也是遇到問題之後,查詢資料,看到參考鏈結那篇文章才知道怎麼回事。

子部件一般情況下也不需要設定背景,即使需要使用qss也完全可以滿足。設定較多的是背景色與圖示,qss中使用background或者background-color的方式可以實現背景色的設定,圖示則可以使用setpixmap或者seticon來設定!

下面介紹qpalette以及paintevent

一、qpalette設定背景

建構函式中可以使用如下方式:

(1)設定背景色

qpalette palette(this->palette());

palette.setcolor(qpalette::window, qt::black);

this->setpalette(palette);

或:

qpalette palette;

palette.setbrush(this->backgroundrole(), qt::black);

this->setpalette(palette);

這裡setcolor和setbrush都可以使用!

(2)設定背景

qpixmap pixmap = qpixmap(":/qm/safe").scaled(this->size());

qpalette palette(this->palette());

palette.setbrush(qpalette::window, qbrush(pixmap));

this->setpalette(palette);

上面方式無論設定背景色還是背景 qpalette::window 與 this->backgroundrole()是等價的!

qt 6.0 是 qpalette::window, 原文章中作者用的是 qpalette::background 這個值現在被廢棄了。

二、paintevent設定背景

(1)設定背景色

void xyzstatusbar::paintevent(qpaintevent *event)
(2)設定背景

void xyzstatusbar::paintevent(qpaintevent *event)
注意:

(1)以上都是用scaled方式對進行了適應視窗大小的設定,因為所給的大小不一定滿足要求,所以採用此方式!當然經過拉伸或者壓縮之後會變形(純色除外),所以對採用此方式時需要注意。

(2)設定背景範圍的時候如果需要充滿整個視窗最好使用this->rect(),因為我看到很多人在使用qrect(0, 0, 400, 400)之類的語句,那麼如果視窗大小改變了呢?此句是不是要跟著變呢?

(3)如果需要背景或者背景色隨可以發生改變時,也就是所謂的換膚功能,則採用paintevent的方式,在需要改變的時候使用update()來進行更新。

(4)this->setautofillbackground(true)又讓我想起了tr(),被很多人濫用。這句話在什麼時候使用呢?不妨採用qpalette設定背景的方式加上與去掉這句話對比一下(在有父視窗的情況下使用)。如果這個qwidget直接show,則有背景色,如果放到乙個父視窗中,就沒有效果。新增該句即可!

(第四條 我試了一下,沒發現用不用 setautofillbackground(true) 有什麼區別, 尷尬?).

Qt 視窗設定背景

1.方法一 qpalette palette palette.setbrush qpalette background,qbrush qpixmap images background.png scaled this size this setpalette palette 2.方法二this se...

Qt設定視窗 按鈕背景色

1 設定視窗背景色時使用如下樣式表 background image url img png bj png 使用後如果背景大小不夠會被平鋪。qpushbutton qpushbutton hover 如果視窗已設定背景,則會出現類似父視窗設定時,如果子視窗未設定相應的屬性覆蓋,則子視窗會使用父視窗對...

Qt設定彈出視窗背景陰影效果

通過maskwidget來實現,原理如下 1.設定要遮擋的窗體 一般是主視窗 2.設定目標視窗,並繫結該視窗的顯示事件,一旦目標顯示,陰影視窗就顯示 反則同樣 3.完成陰影效果。據觀察存在一定問題,目標視窗的父視窗問題,工作列會有兩個視窗圖示如 直接插入 maskwidget.h ifndef ma...