当前位置:网站首页>QWidget代码设置样式表探讨
QWidget代码设置样式表探讨
2022-07-06 09:28:00 【Larry_Yanan】
前言
众所周知,在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被绘制到窗口中。)
可能是这个原因吧,也导致了样式表重复设置有问题。
因为在设置样式时疑惑了很久,浪费了不少时间,所以试图分析记录下来,但你说具体是什么原因?
很抱歉,实力水平不咋地,还真是没太想明白。可以指教一下,或者有待我日后补充吧。
边栏推荐
- Quick to typescript Guide
- 【练习-6】(PTA)分而治之
- 【练习-7】Crossword Answers
- 860. Lemonade change
- Information security - security professional name | CVE | rce | POC | Vul | 0day
- [exercise-5] (UVA 839) not so mobile (balance)
- Programmers, what are your skills in code writing?
- 【练习-1】(Uva 673) Parentheses Balance/平衡的括号 (栈stack)
- Raspberry pie csi/usb camera uses mjpg to realize web camera monitoring
- mysql导入数据库报错 [Err] 1273 – Unknown collation: ‘utf8mb4_0900_ai_ci’
猜你喜欢
Gartner:关于零信任网络访问最佳实践的五个建议
Programmers, what are your skills in code writing?
[analysis of teacher Gao's software needs] collection of exercises and answers for level 20 cloud class
Penetration testing (5) -- a collection of practical skills of scanning King nmap and penetration testing tools
2078. Two houses with different colors and the farthest distance
1013. Divide the array into three parts equal to and
1605. Sum the feasible matrix for a given row and column
b站 實時彈幕和曆史彈幕 Protobuf 格式解析
Radar equipment (greedy)
渗透测试 2 --- XSS、CSRF、文件上传、文件包含、反序列化漏洞
随机推荐
[exercise-9] Zombie's Treasury test
渗透测试 2 --- XSS、CSRF、文件上传、文件包含、反序列化漏洞
Opencv learning log 26 -- detect circular holes and mark them
[exercise-1] (UVA 673) parentheses balance/ balanced brackets (stack)
CEP used by Flink
Research Report of cylindrical grinder industry - market status analysis and development prospect forecast
信息安全-威胁检测-flink广播流BroadcastState双流合并应用在过滤安全日志
1013. Divide the array into three parts equal to and
Opencv learning log 12 binarization of Otsu method
MySQL import database error [err] 1273 - unknown collation: 'utf8mb4_ 0900_ ai_ ci’
D - function (HDU - 6546) girls' competition
TCP's three handshakes and four waves
Nodejs+vue网上鲜花店销售信息系统express+mysql
Auto.js入门
HDU - 6024 building shops (girls' competition)
If you want to apply for a programmer, your resume should be written like this [essence summary]
【练习-7】(Uva 10976)Fractions Again?!(分数拆分)
Truck History
【练习-4】(Uva 11988)Broken Keyboard(破损的键盘) ==(链表)
Opencv learning log 24 -- Hough transform 2 (maximum interval and minimum length can be limited)