QWidget代码设置样式表探讨

前言

众所周知,在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被绘制到窗口中。)
可能是这个原因吧,也导致了样式表重复设置有问题。

因为在设置样式时疑惑了很久,浪费了不少时间,所以试图分析记录下来,但你说具体是什么原因?

很抱歉,实力水平不咋地,还真是没太想明白。可以指教一下,或者有待我日后补充吧。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值