Qt 背景小节

 Qt 背景小节

一、设置背景的几种方法。

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觉得既然你要了这样的效果就得重新实现标题栏和拖动。呵呵……所谓有得有失嘛。

 

你可能感兴趣的:(背景,职场,qt,休闲)