关于QT stylesheet的使用的一点见解

本文介绍了QT中使用样式表的最佳实践,包括如何管理和维护样式表、解决继承问题、理解优先级规则等内容。针对大型项目的复杂控件关系,推荐使用资源文件加载QSS实现换肤效果。

QT可以使用qss这种类似于css的语法的语句进行对控件的外观的控制,达到我们想要的效果

在编写QT程序时,我们可以通过palette调色板来设置各个颜色,但是这个是受限于平台的,而stylesheet是可以根据平台而进行渲染的,具体的实现我没有看过源代码,这里写一写在使用stylesheet过程中遇到的问题,以及stylesheet的心得

 

1. 首先,如果你参与的项目比较大,各个控件之间的关系父子关系以及继承关系比较复杂,我的建议是不要在代码内部对特定的控件使用setstylesheet,为了方便维护,使用资源文件,加载qss文件的方法来实现换肤个性化。

如果实在是要在内部使用stylesheet,请在语句里指定类的具体名称以及控件的objectname,注意请最好使用独一无二的objectname,除非你说我的控件的继承的父类对象以及同类对象都没有该objectname,但是你要明白,有时候工程不会一个人来维,所以,还是设定objectname比较好。。。

 

2. 然后需要注意的是stylesheet的继承问题,一个控件的stylesheet在没有主动设置之前是继承自祖先控件以及application的stylesheet,这二者的融合体就是最初的控件的stylesheet,说是融合,其实就是把application和父亲控件的stylesheet的内容组合起来,在两者的语句出现冲突的时候,和本控件更亲密的控件的stylesheet的语句优先级更高,也就是父亲要比application优先级高。

还有一点就是背景图片的问题,由于继承的存在,本控件会继承父亲的背景图片,如果不需要该背景图片,一个有效地办法就是自己去指定背景图片,没有背景的话,那就指定一个不存在的文件就好。

 

3. 优先级的问题,控件存在的父子关系以及继承关系等,并且控件也有各种伪状态,在这多条语句都符合控件的情况下,控件应该根据那条语句进行渲染呢?这就是需要语句的优先级来确定。很显然,更加具体的语句要优先级更高,有伪状态的优先级高,有指定objectname的优先级最高,也就是说

QPushButton{color:red;}  QPushButton:hover{color: green}  QPushButton#A{color: white}这几句话里,优先级逐步变高

优先级很容易忽视的一点就是,类之间的继承关系不会影响优先级的判断,就是说QPushButton{color: white} QAbstractButton{color: black} 这两句话优先级是一样的,对于优先级一样的语句,谁位于之后,那它的优先级就更高,也就是说在写qss的时候我们需要时刻注意语句的先后顺序问题,当然回避这个问题的有效办法就是设置objectname,那如果对于QPushButton说QPushButton#A{} 和 QAbstractButton#A{}谁的优先级更高呢?结论是,谁在后面谁更高。只要记住类的继承不会影响优先级的判断就好。

在这里,还需要注意一点,语句的顺序是会发生变化的,假如说application的stylesheet是 QPushButton#A{}  QAbstractButton#A{},父控件里重新制定了stylesheet是QAbstractButton  QPushButton#A{} ,那么本控件根据第一条的规则,以父控件的顺序为准

4. 最近有关stylesheet的问题,在实现控件的时候,将stylesheet加载在越外层越好。就是说,如果想要改变控件A的样式,通过加载在application上是最好的,其次是控件A的各种父控件B、C...,最后再考虑加载到自身。原因是为了提高控件的创建效率,如果在父控件有很多子控件,而这些子控件在setstylesheet时会进行重画操作,同时也会重画和自身控件相连的区域,会很浪费时间,而直接加载在父控件上就可以避免这个问题。在控件比较小的并且比较少的时候这个问题不明显,但是一旦大批量性能测试就会很明显。

5.关于QWidget的stylesheet设置问题,网上查询到的结果,当然也是qt帮助手册里的

https://bbs.youkuaiyun.com/topics/390907243

QWidget
Supports only the background, background-clip and background-origin properties.
If you subclass from QWidget, you need to provide a paintEvent for your custom QWidget as below:
 void CustomWidget::paintEvent(QPaintEvent *)
 {
     QStyleOption opt;
     opt.init(this);
     QPainter p(this);
     style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
 }
The above code is a no-operation if there is no stylesheet set.
Warning: Make sure you define the Q_OBJECT macro for your custom widget.

 剩下的就是关于的stylesheet的语法,参见QT的帮助文档,搜索关键字Style Sheet 即可,这里就不多赘述

这是本人的个人见解和自己测试的结果,如果有问题的话请留言,我会及时改正防止误导新人,如果之后还有想写的,我也会继续追加

Qt StyleSheet是一种用于自定义Qt应用程序用户界面的技术,可以通过对QSS文件进行定义来设置控件的外观和样式。使用Qt StyleSheet,开发者可以实现自定义按钮、标签、进度条、滑块等控件的样式效果,使应用程序的外观更加美观和个性化。 在线使用Qt StyleSheet十分方便。首先,我们需要创建一个QSS文件,可以使用文本编辑器编写QSS的样式规则,定义不同控件的外观效果。然后,将QSS文件加载到Qt应用程序中,可以通过调用QWidget的setStyleSheet()函数将QSS应用到单个控件,或者使用QApplication的setStyleSheet()函数将QSS应用到整个应用程序。 在线使用Qt StyleSheet意味着我们可以实时修改QSS样式,当样式文件发生变化时,应用程序会自动刷新并应用新的样式,无需重新启动应用程序。这样,我们就可以实时调整控件的大小、颜色、字体、边框等属性,达到我们想要的效果。 Qt StyleSheet提供了丰富的样式选择器和样式属性,开发者可以根据自己的需要定义不同控件的不同状态下的样式效果。此外,Qt还提供了一些预定义的样式类和样式属性,可以直接使用或者基于其进行修改。开发者还可以通过样式继承来减少代码量,将一些共同的样式属性定义在父类样式中,子类的样式只需要定义特定的样式属性即可。 总之,Qt StyleSheet是一种非常灵活和强大的样式定义方法,可以帮助我们轻松定制和美化Qt应用程序的用户界面。在线使用Qt StyleSheet让我们能够实时调整样式效果,提高开发效率,使应用程序更加吸引人。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值