前邊的文章http://blog.csdn.net/NRC_DouNingBo/archive/2010/04/28/5540427.aspx介紹了如何給QTextEdit加背景圖片,但是由於圖片也會跟着翻屏,所以用了一種折中的辦法就是:將QTextEdit設置為透明,而后在其后邊的窗口的該位置處刷上圖片即可。 那這里就說一下如何讓QTextEdit控件背景變為透明。
正如上一篇文章所講的那樣,在Qt中所有問題都要分兩種體系來討論,一種是QWidget體系,一種則是QGraphicsWidget體系。此處也不例外。
一: 對於QWidget體系而言:亦即用的都是QWidget以及其派生類。對於此處:亦即QTextEdit的父對象也是QWidget或其派生類。
那么我們要做的就是:讓QTextEdit背景變為透明,而后在其后邊的父窗口該位置處刷上圖片。
①設置QTextEdit為背景透明:
QPalette pl = iEdit->palette();
pl.setBrush(QPalette::Base,QBrush(QColor(255,0,0,0)));
iEdit->setPalette(pl);
即:用完全透明的畫刷來刷一下編輯框的背景即可!
而其父窗口在該位置處刷圖片,關鍵是注意這個父窗口是不是頂層窗口(其有無父窗口),若是則注意不能使用setStyleSheet()來刷(原因見文章http://blog.csdn.net/NRC_DouNingBo/archive/2010/05/07/5565212.aspx)。
二:對於QGraphicsWidget體系,則用如下方式來設置,這里我直接用代碼了:
MainWindow::MainWindow(QWidget *parent)
: QGraphicsView(parent)
{
this->resize(360,640);
iScene = new QGraphicsScene(0,0,360,640);
iEdit = new QTextEdit();
iEdit->resize(360,400);
//下邊這段給父view刷圖片
QPalette palette;
palette.setBrush(this->backgroundRole(),QBrush(QImage(":/bmp/dou.jpg")));
this->setPalette(palette);
//此段負責設置該編輯框item背景透明
palette.setBrush(QPalette::Base,QBrush(QColor(255,0,0,0)));
iEdit->setPalette(palette);
QGraphicsProxyWidget* widget = iScene->addWidget(iEdit);
palette.setBrush(QPalette::Window,QBrush(QColor(255,0,0,0)));
widget->setPalette(palette);
this->setScene(iScene);
}
可見,這其中還是有很大區別的,而且似乎有些地方難以理解,其實關鍵這里邊牽扯兩個問題,一個是QWidget體系和QGraphicsWidget體系的區別是什么? 一個是用樣式表QPalette設置背景顏色/圖片的兩種方法的區別(亦即:QPalette的setBrush()函數的第一個參數是QPalette::Base形式 還是 ptr->backgrounRole() 的區別)。
關於這兩個問題, 我過會會寫兩外兩篇文章來專門論述一下,但是上邊代碼你可以直接拷貝拿去用,沒問題的。
測試環境:Qt4.5.0 + VC2005
后補:
1:QWidget體系與QGraphicsWidget體系之間的區別
http://blog.csdn.net/NRC_DouNingBo/archive/2010/05/09/5571149.aspx
2:Qt中如何使用樣式表QPalette以及相關注意事項
http://blog.csdn.net/NRC_DouNingBo/archive/2010/05/09/5571187.aspx