Qt中绘制窗口的背景图片注意事项(常见的setStyleSheet和QPalette)

一句话总结就是:使用QPalette来设置窗口的背景图片可以避免出现使用setStyleSheet设置背景后子窗口也是父窗口背景的情况。

使用QPalette绘制背景的代码如下:

    setAutoFillBackground(true);  //这句一定不能少,否则图片显示不出来。
    QPalette palette;
    palette.setBrush(QPalette::Background, QBrush(QPixmap(":/desktop/Qt-design-pic/user-passwd.jpg")));
    setPalette(palette);

使用setStyleSheet可以在Qt的design页面,右键->Change styleSheet来add background-image。或者就是在代码里实现:

this->setStyleSheet("background-image:url(:/desktop/Qt-design-pic/user-passwd.jpg)");

或者创建button然后设置button:

iButton = new QPushButton(this);
iButton ->setStyleSheet("background-image:url(:/desktop/Qt-design-pic/button.jpg)");

但是用这种方式设置背景色后,子窗口也会是父窗口的背景色。比较不灵活。


具体更详细的解释参考这篇博客,讲的挺透彻的,还有例子。http://blog.csdn.net/NRC_DouNingBo/article/details/5565212

下面引用这篇博客的总结:


对于setStyleSheet函数:

①:该函数只能用于设置有父窗口的子窗口的背景!如果一个窗口没有子窗口,则无法使用该函数来设置背景颜色或图片!!

②:同时:对于一个父窗口而言:如果我们用setStyleShette设置了其样式,而对于其子窗口:如果没有用同样的函数来设置的话, 则其子窗口的样式和其父窗口完全一致,亦即:其集成了自己父窗口的样式!

 ③:延伸:对顶层窗口(没有父窗口),其有若干个子窗口,则当我们用setStyleShette来设置这个顶层窗口的样式后,依据①可知:该父窗口本身没有任何变化,亦即设置没有生效;而其子窗口:只要子窗口本身没有用setStyleShette来设置自己的样式表,则其就是用的自己父窗口的样式表!!


总结:

     1:不要在顶层窗口(无父类的窗口)中使用setStyleSheet() ,否则其一父窗口的背景不会改变,其次其子窗口的背景设置方法变得局限唯一,不能再使用其它方法!

     2:如果一个一般窗口(非顶层窗口)还有子窗口,那最好不要使用setStyleSheet()来设置其背景颜色,因为虽然此时该窗口的背景设置是生效的,但是其子窗口的背景设置也变得局限唯一,只能使用setStyleSheet,而不能使用其它方法!  当然:你如果就是只想使用这种方法,那也完全可以!

     说白了就是:不要再MainWindow中使用setStyleSheet()!

      而上边之所以强调拓宽子窗口设置背景的方法范围,这是因为:如果只能用setStyleSheet样式表来设置背景图片的话,该图片是无法缩放的,如果其大小与widget窗口大小不相符,则我们无法用程序来实现图片的缩放,除非我们直接处理图片使其大小与widget窗口相符; 而如果不局限于用setStyleSheet样式表来设置的话,我们可以选择用QPalette调色版,其内部setBrush()之前,我们完全可以先对图片进行scale缩放再刷到窗口上,这样就避免直接去处理图片,灵活性强一点!




你可能感兴趣的:(Qt开发)