前言
众所周知,在QT中修改部件样式,是通过样式表的方式来设置的。而设置样式表,一般常用就两种方式,分别为QT Designer界面直接右击设置样式表,以及代码设置样式表。
正常情况下都是可以成功的,但是在某种情况下却不成功,让我娓娓道来。
两种样式表设置方式的对比
第一种,QT Designer界面直接右击部件,在样式表选项里面输入。
右击在background-color里面随意设置一个颜色,这就是最简单的样式表设置了。意思是,设置一个蓝色的背景颜色。
有关样式表语句的相关语法,可以慢慢学习,其实还挺多的,可能接触网页的同学比较好上手一点。
对于我本人来说,用到最多的写法就是:
#widgettop{background-color: rgb(0, 170, 255);}
或者
#QWidget{background-color: rgb(0, 170, 255);}
为什么要用#XXX{…}来包括住原本的样式语句呢?原因是因为像QWidget这类的窗口容器控件,它们身为父类,样式设置会自动继承到他的子类上面去。也就是说如果我往QWidget里面放一个QPushButton按钮或者QLabel标签,他们都会继承父类QWidget的样式,即为蓝色。
这显然在某些情况下是不适用的。当然子类重复设置样式语句的话,会覆盖掉父类的样式,但一般用#XXX{…}的话,就能保证语句只实现在父类的QWidget中,不会影响它里面的子类控件。
这里讨论一下widgettop和QWidget,前者是该控件实例时的对象名objectName,后者是该控件的类名,两者都能成功进行设置,可以满足以上两段文字讨论的效果,即为设置蓝色。
回到开头,除了在QT Designer里面直接设置样式表,还可以在代码当中设置,例如:
ui->widgettop->setStyleSheet("#widgettop{background-color: rgb(255, 170, 127);}");
或
ui->widgettop->setStyleSheet("#QWidget{background-color: rgb(255, 170, 127);}");
这两种都是可以成功设置的,实现的效果为橙色:
特殊的情况
以上两种情况的样式设置搞清楚后,我讲一下我遇到的特殊情况:
样式表中的一些参数,包含了一些尺寸大小信息:例如窗口的边框宽度,四角圆角的半径等,这些数值可能会根据软件窗口所在当前显示器的分辨率,需要灵活调整。
比如,在1080P屏,QWidget的圆角半径是10px,但在4k屏上,则需要显示为20px,才能达到观看尺寸一致的情况。
所以,也就可能会遇到:已经在QT Designer里面设置过样式表,然后代码内重复设置样式表,的情况。
正常来说,样式表的重复设置,会覆盖掉原先设置的,所以以上的做法也是OK。
那问题究竟是什么呢?是QWidget里面包含了其他的控件!!
产生的问题
随便在设置了蓝色背景的Widget里面丢一个QLabel
然后代码里再设置橙色
ui->widgettop->setStyleSheet("#widgettop{background-color: rgb(255, 170, 127);}");
结果是蓝色
把QLabel移出
再次编译,为橙色
这和样式表的设置方式没有关系,就是QWidget里面是否包含其他控件的区别
初步结论
QWidget当做容器,且内部有子控件时,QT Designer的样式表设置和代码设置冲突,需取消QT Designer的设置,完全在代码内部设置才可以。
分析
QWidget这个类还蛮奇怪的,它是容器类,本质上是用来装东西的,但是如果里面没有东西,他又可以作为一个独立的窗口,如果它没有父类指向的话,甚至可以作为一个独立的Windows窗口,和QMainWindow和QDialog效果是一样的,而且本人觉得它比较万用灵活,所以界面窗口一般都采用QWidget来做。
但正如以上分析的,这个类确实存在不少的坑。不只是这个,在对于没有父类指向的顶层QWidget窗口设置背景时,往往是不成功的,需要在paintEvent重载里面,设置一段代码,样式表才会生效
void XXX::paintEvent(QPaintEvent *)
{QStyleOption opt;opt.init(this);QPainter p(this);style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);}
(引用一下别人的描述:
如果要子类化一个QWidget,为了能够使用样式表,则需要提供paintEvent事件。这是因为QWidget的paintEvent()是空的,而样式表要通过paint被绘制到窗口中。)
可能是这个原因吧,也导致了样式表重复设置有问题。
因为在设置样式时疑惑了很久,浪费了不少时间,所以试图分析记录下来,但你说具体是什么原因?
很抱歉,实力水平不咋地,还真是没太想明白。可以指教一下,或者有待我日后补充吧。