长沙商城网站建设报价公示,电话网站源码,网络综艺节目策划方案,浏览加速器在Qt中设置widget背景颜色或者图片方法很多种#xff1a;重写paintEvent() , 调色板QPalette , 样式表setStyleSheet等等。 但是各种方法都有其注意事项#xff0c;如果不注意则很容易陷入麻烦中。 1#xff1a;setStyleSheet() 这个函数我一直很喜欢使用#xff0c;因为只…在Qt中设置widget背景颜色或者图片方法很多种重写paintEvent() , 调色板QPalette , 样式表setStyleSheet等等。 但是各种方法都有其注意事项如果不注意则很容易陷入麻烦中。 1setStyleSheet() 这个函数我一直很喜欢使用因为只要写一句就可以实现效果比其他方法都简单但是其却有一个很值得注意的地方也就是这个地方让我大吃苦头。 亦即①该函数只能用于设置有父窗口的子窗口的背景如果一个窗口没有子窗口则无法使用该函数来设置背景颜色或图 片 ②同时对于一个父窗口而言如果我们用setStyleShette设置了其样式而对于其子窗口如果没有用同样的函数来设 置的话 则其子窗口的样式和其父窗口完全一致亦即其集成了自己父窗口的样式 ③延伸对顶层窗口没有父窗口其有若干个子窗口则当我们用setStyleShette来设置这个顶层窗口的样式后依据①可知该父窗口本身没有任何变化亦即设置没有生效而其子窗口只要子窗口本身没有用setStyleShette来设置自己的样式表则其就是用的自己父窗口的样式表 例如 主窗口没有父类为MainWin MainWin::MainWin() { this-setStyleSheet(background-image:url(:/bmp/IMG_0345.JPG)); iButton new QPushButton(this); iLabel new QLabel(iButton); } 运行一下效果如下 亦即虽然我们设置的是顶层的父窗口但是该样式却是在其子窗口中生效而顶层父窗口没有任何变化 这验证了①。 修改一下上例代码 MainWin::MainWin() { this-setStyleSheet(background-image:url(:/bmp/IMG_0345.JPG)); iButton new QPushButton(this); iLabel new QLabel(iButton); iLabel-setStyleSheet(background-image:url(:/bmp/1257253475842.jpg)); } 则运行效果如下 可见子窗口只有调用setStyleSheet()设置了自己的样式后才可以隔断父窗口的样式否则其将是用父窗口的样式。 再修改一下代码 MainWin::MainWin() { iButton new QPushButton(this); iButton -setStyleSheet(background-image:url(:/bmp/IMG_0345.JPG)); iLabel new QLabel(iButton); } 运行一下效果如下 可见设置有父窗口的子窗口时setStyleSheet()一定生效 后来我又思考了一个问题那就是对于顶层父窗口如果我setStyleSheet()设置了样式表而对其子窗口我用其他方法比如用QPalette调色板来设置背景图片/颜色这时子窗口的背景到底是由继承自父窗口的样式表决定呢还是由子窗口本身的QPalette调色板决定呢 再次修改代码 MainWin::MainWin() { this-setStyleSheet(background-image:url(:/bmp/IMG_0345.JPG)); iButton new QPushButton(this); iLabel new QLabel(iButton); QPalette palette; palette.setBrush(iLabel-backgroundRole(),QBrush(QImage(:/bmp/1257253475842.jpg))); iLabel-setPalette(palette); iLabel-setAutoFillBackground(true); } 此段代码中我用QPalette来设置子窗口的背景图片看下到底是样式表还是调色板生效效果如下 由此可见一旦顶层窗口设置了样式表则其子窗口无论用什么方法来设置背景都会不生效 那如果不是顶层窗口而仅仅是一般窗口设置了样式表呢再次修改代码 MainWin::MainWin() { iButton new QPushButton(this); iButton -setStyleSheet(background-image:url(:/bmp/IMG_0345.JPG)); iLabel new QLabel(iButton); QPalette palette; palette.setBrush(iLabel-backgroundRole(),QBrush(QImage(:/bmp/1257253475842.jpg))); iLabel-setPalette(palette); iLabel-setAutoFillBackground(true); } 运行效果同上这说明不管是顶层窗口还是一般窗口只要用setStyleSheet设置了样式表则其子窗口用其它方式设置背景颜色/图片均不生效只能用同样方式setStyleSheet来设置更改 为了验证上边的结论再次修改代码 MainWin::MainWin() iButton new QPushButton(this); iLabel new QLabel(iButton); QPalette palette; palette.setBrush(iLabel-backgroundRole(),QBrush(QImage(:/bmp/1257253475842.jpg))); iLabel-setPalette(palette); iLabel-setAutoFillBackground(true); } 运行一下 此时调色板才生效这也间接证明了上述结论。 总结 1不要在顶层窗口无父类的窗口中使用setStyleSheet() 否则其一父窗口的背景不会改变其次其子窗口的背景设置方法变得局限唯一不能再使用其它方法 2如果一个一般窗口非顶层窗口还有子窗口那最好不要使用setStyleSheet()来设置其背景颜色因为虽然此时该窗口的背景设置是生效的但是其子窗口的背景设置也变得局限唯一只能使用setStyleSheet而不能使用其它方法 当然你如果就是只想使用这种方法那也完全可以 说白了就是不要再MainWindow中使用setStyleSheet() 而上边之所以强调拓宽子窗口设置背景的方法范围这是因为如果只能用setStyleSheet样式表来设置背景图片的话该图片是无法缩放的如果其大小与widget窗口大小不相符则我们无法用程序来实现图片的缩放除非我们直接处理图片使其大小与widget窗口相符 而如果不局限于用setStyleSheet样式表来设置的话我们可以选择用QPalette调色版其内部setBrush()之前我们完全可以先对图片进行scale缩放再刷到窗口上这样就避免直接去处理图片灵活性强一点 本文来自CSDN博客转载请标明出处http://blog.csdn.net/NRC_DouNingBo/archive/2010/05/07/5565212.aspx 转载于:https://www.cnblogs.com/tiantiantian-dianzi/p/5814042.html