• 4374阅读
  • 0回复

[原创]Qt 背景小节 [复制链接]

上一主题 下一主题
离线gota
 
只看楼主 倒序阅读 楼主  发表于: 2011-11-21
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觉得既然你要了这样的效果就得重新实现标题栏和拖动。呵呵……所谓有得有失嘛。

快速回复
限100 字节
 
上一个 下一个