概述
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.csdn.net/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 stylesheet的使用的一点见解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复