首先說方法,在給widget或者frame或者其他任何類型的控件添加背景圖時,在樣式表中加入如下代碼,指定某個控件,設置其背景。
類名 # 控件名
{
填充方式:圖片路徑
}
例如:
QWidget#Widget
{border-image: url(:/resource/bg2.png);
}
或者
QFrmae#frame
{border-image: url(:/resource/bg2.png);
}
如果單純改變樣式表,沒有指定控件的話,內部的其他控件背景也會改變。
特別提醒:類名 # 控件名,其中控件名要準確,假如你把widget的名字改成了其他,那么這里的控件名要一致。
錯誤示范:
如圖:效果非常雜亂。
正確示范:
效果:只有指定的widget背景改變,widget內部控件背景不變
我們知道Qt中所有界面類的祖先是QWidget,因此學會給QWidget設置圖片是必須掌握的技能之一。但是編程是沒有標準答案的,達到同一效果可以有許多不同的方法。那么給窗口設置背景圖片又有多少種方法呢?接下來通過寫個測試例子看看。
首先使用QtCreator新建一個基于QWidget的工程,然后給工程添加一個資源文件,接著在資源文件中添加一張圖片bg.jpg。
1.使用調色板QPalette來設置圖片。
首先獲得Widget的調色板,然后設置設置調色板背景(setBrush),最后將調色板設置到Widget中。
由于圖片太大導致整個窗口顯示不下。
2.在paintEvent事件中繪制圖片。
drawPixmap在Widget的整個矩形區域繪制背景圖片,第三個參數為要繪制的圖片區域,傳入空的矩形表示整個圖片區域。
通過這種方式可以將圖片平鋪到窗口上,缺點就是要使用paintEvent事件需要新建一個類,不適合子窗口。
3. 使用樣式表(setStyleSheet).
使用樣式表可以很方便設置界面,而且非常高效,還能讓界面和邏輯分離。真的是Qt里非常好用的一個東西,設置背景圖片的語句也很簡單。
一句話就搞定了,這里使用border-image屬性可以讓圖片平鋪到窗口,效果與第二點一樣。不過在本例中由于Widget是頂層窗口,所以直接設置樣式表也不會顯示。所以樣式表比較適合子窗口來使用。
4.使用間接的方式來設置背景,比如說在窗口上覆蓋一個QLabel,這個label始終與窗口一樣大。然后在label中設置圖片,視覺效果上和直接給窗口設置背景圖片一樣。
創建一個label作為Widget的子窗口,然后設置圖片。通過在Widget的resizeEvent事件中設置label的大小與Widget一致。這里需要注意調用QLabel的setScaledContents(true),否則效果和第一種一樣。由于QLabel可以用來顯示動圖因此使用這種方式可以實現窗口的動態背景圖片。