方法1. setStylSheet{"QDialog{background-image:url()"}} //使用styleSheet 這種方法的好處是繼承它的dialog都會自動設置背景,例如更換皮膚就是一個不錯的選擇
方法2. QPalette pal;
pal.setBrush(QPalette::Background,QBrush(QPixmap("")));
this->setPalette(pal);
方法3.在paintEvent(QPaintEvent *)事件中 //這種用於各種自定義控件
QPainter painter(this);
painter.drawPixmap(rect(), QPixmap&);
http://blog.csdn.net/what951006/article/details/51538812
----------------------------------------------------------------------------------------------------------------
添加在構造函數里面:
- QPixmap pixmap(":/new/prefix1/images/1.png");
- QPalette palette;
- palette.setBrush(backgroundRole(), QBrush(pixmap));
- setPalette(palette);
http://blog.csdn.net/emdfans/article/details/27826613
----------------------------------------------------------------------------------------------------------------
前言:窗口背景無非兩種,及背景顏色、背景圖片。Qt中窗口背景如何設置?總結以下三種方法。
1、QPalette設置背景
2、實現paintEvent,使用QPainter來繪制背景
3、使用QSS來設置背景
---------------------------------------------------------------
關於QSS(
樣式表)的使用不想多說,一般我不用QSS設置窗口背景,
也不建議使用。(注意:這里是對於窗口而言)。如果是子部件當然可以。因為窗口使用QSS設置背景之后,若子部件不使用同樣的方式來設置,默認則會繼承父窗口的樣式。
子部件一般情況下也不需要設置背景圖片,即使需要使用QSS也完全可以滿足。設置較多的是背景色與圖標,QSS中使用background或者background-color的方式可以實現背景色的設置,圖標則可以使用setPixmap或者setIcon來設置!
----------------------------------------------------------------------
一、
QPalette設置背景
構造函數中可以使用如下方式:
1)設置背景色
QPalette palette(this->palette());
palette.setColor(QPalette::Background, Qt::black);
this->setPalette(palette);
或:
QPalette palette;
palette.setBrush(this->backgroundRole(), Qt::black);
this->setPalette(palette);
這里setColor和setBrush都可以使用!
這里需要
特別注意一點,如果
QWidget直接show出來,是有背景色的,但是如果它作為一個父QWidget的子窗口時就沒有背景了!此時需要添加如下代碼:
setAutoFillBackground(true);
2)設置背景圖片
QPixmap pixmap = QPixmap(":/qm/safe").scaled(this->size());
QPalette palette(this->palette());
palette.setBrush(QPalette::Background, QBrush(pixmap));
this->setPalette(palette);
上面方式無論設置背景色還是背景圖片QPalette::Background與this->backgroundRole()是等價的!
二、
paintEvent設置背景
1)設置背景色
void IIIMark::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setBrush(Qt::black);
painter.drawRect(this->rect());
}
2)設置背景圖片
void IIIMark::paintEvent(QPaintEvent *)
{
QPixmap pixmap = QPixmap(":/qm/safe").scaled(this->size());
QPainter painter(this);
painter.drawPixmap(this->rect(), pixmap);
}
三、
QSS(
樣式表)設置背景
1)設置背景顏色
MainWin::MainWin()
{
this->setStyleSheet(" color: rgb(102, 102, 0);">);
iLabel = new QLabel(this);
iLabel->setStyleSheet(" color: rgb(102, 102, 0);">);
}
2)設置背景圖片
MainWin::MainWin()
{
this->setStyleSheet("background-image:url(:/bmp/IMG_0345.JPG)");
iLabel = new QLabel(this);
iLabel->setStyleSheet("background-image:url(:/bmp/1257253475842.jpg)");
}
---------------------------------------------------------------
注意:
(1)以上都是
用scaled方式對圖片進行了適應窗口大小的設置,因為所給的圖片大小不一定滿足要求,所以采用此方式!當然圖片經過拉伸或者壓縮之后會變形(純色圖片除外),所以對圖片采用此方式時需要注意。
(2)設置背景范圍的時候如果需要充滿整個窗口最好使用this->rect(),因為我看到很多人在使用QRect(0, 0, 400, 400)之類的語句,那么如果窗口大小改變了呢?此句是不是要跟着變呢?
(3)如果需要背景圖片或者背景色隨可以發生改變時,也就是所謂的換膚功能,則采用paintEvent的方式,在需要改變的時候使用update()來進行更新。
(4)this->setAutoFillBackground(true)又讓我想起了tr(),被很多人濫用。這句話在什么時候使用呢?不妨采用QPalette設置背景的方式加上與去掉這句話對比一下(在有父窗口的情況下使用)。如果這個QWidget直接show,則有背景色,如果放到一個父窗口中,就沒有效果。添加該句即可!
-----------------------------
對比幾種方法:前兩種可以輕松實現圖像的縮放(使用scaled函數),而按照上面使用QSS樣式表設置
background-image的方式卻不能實現,若使用樣式表實現靜態圖像的縮放可以設置
border-image屬性:
setStyleSheet(QString::fromUtf8("border-image: url(:/png/example.png)"));
這樣當窗口大小改變時圖像也會隨着縮放。
http://blog.163.com/dingmz_frcmyblog/blog/static/21730402320141115552592/