一、设置背景的几种方法。
1)最简单的stylesheet
这个方法就是设置Widget的styleSheet属性,其值为字串,内容和通常的Css一样。
上代码:
Test w; // w is a QWidget object
w.setStyleSheet("background:url(:/images/bg.png)"); // Qt's resource file
w.show();
有文章说stylesheet会使得子widget无法重新设置自己的背景,我试验过没有这样的情况,可能我试验有问题,更大的可能是新版本的QT已经修改了相关bug。
还可以通过w.setObjectName("july");
来设置widget的id。这样在stylesheet中就更容易控制了。比如
setStyleSheet(“QLabel #july {background: green;}”);
2)使用QPalette
这个方法通过继承Widget原有的palette(),然后给新的palette加入背景图片的属性(通过QBrush),再把它赋给Widget。上代码:
QPixmap bgImages(":/images/bg.png");
QPalette bgPalette = w.palette();
bgPalette.setBrush(QPalette::Background,bgImages);
w.setPalette(bgPalette);
3)使用paintevent
这个方法就是通过重新实现QWidget的paintEvnet()在widget显示的时候重新绘制widget。需要使用QPainter来绘制,上代码:
void Test::paintEvent(QPaintEvent *event)
{
// firsr set our pen
QPainter painter(this);
painter.setPen(QPen(Qt::black,2,Qt::SolidLine,Qt::RoundCap));
// then paint our book's A face a rectrangel
painter.drawRect(50,0,550,750);
// then draw right line
painter.drawLine(0,50,0,800);
// then draw bottom line
painter.drawLine(0,800,600,800);
// then draw a line connect A face and B face
painter.drawLine(0,50,50,0);
// then draw a arc connect A face and B face
painter.drawArc(0,750,100,100,90*16,90*16);
// then draw an other arc to connect
painter.drawArc(575,750,50,50,90*16,180*16);
}
这个用pen画了一个类似书本的图像,也可以通过设置setBrush用图片来填充,这样就可以得到背景图片了。
二、透明背景
我现在用个是Qt 4.7.3。所以以下说的都是适用这个版本的,因为版本不同会导致各种各样的问题。比如在新版本中抛弃了Qt::WStyle_NoBorder这样一些WindowFlags,而用Qt::FramlessWindowHint替代,所以基于以前的Flags的透明效果也就不其作用了。
1)使用stylesheet
首先自己做好一个带有透明效果的png图片。然后用上面介绍的Stylesheet的方法将图片设置成widgetd的背景图片。这个时候,还会有边框和背景色,然后设置一下Qt::FramlessWindosHint来消除边框设置Qt::WA_TranslucentBackground来使背景色透明。
上代码:
Test w;
w.setStyleSheet("background:url(:/images/bg.png)");
w.setWindowFlags(Qt::FramelessWindowHint);
w.setAttribute(Qt::WA_TranslucentBackground,true);
2)使用png图片配合mask()
同上面一样自己做好一个带有透明效果的png图片。然后用上面介绍的QPalette方法,将图片设置成widget的背景,但是这是会发现在Windows下面,透明的部分编程了黑色。这个时候在把父widget的mask设置成和图片一样的就可以了,具体原因可以查下Qt处理图片mask的资料。上代码:
/*
*set background image
*/
QPixmap bgImages(":/images/bg.png");
QPalette bgPalette = this->palette();
bgPalette.setBrush(QPalette::Background,bgImages);
this->setPalette(bgPalette);
setMask(bgImages.mask());// set background mask attribute same as background's image
总结:
还有使用setWindowOpacity(1)的方法通过透明度来设置背景透明,这个我没有试验成功,有兴趣的朋友可以尝试一下。这里大家在通过这些方法设置背景后会发现标题栏不见了,而且window也不可以用鼠标拖动,这个好像是因为设置了Qt::FramelessWindowHint,但是用Palette方法也会消失。可能Qt觉得既然你要了这样的效果就得重新实现标题栏和拖动。呵呵……所谓有得有失嘛。