Qt控件样式设置其一(常见方法及优缺点)

如果你对Qt有基本的了解,应该知道它的一大优点是跨平台,可以在不同的系统中编译运行。但在我看来,Qt还有另外一个优点,就是制作界面比较方便和灵活,能够实现主流静态效果的桌面应用。(如果需要实现比较灵动的动画效果,可能需要qml或者其他方式,但那桌面应用一般没有像手机端那样丝滑效果要求)

回到正题,在Qt中有什么设置样式的方法呢?无非就是设置样式表,但设置样式表的方式有很多种,以下具体分析一下,说一下各自的优缺点:

1.ui文件编辑

最为常见的方法,也是新手接触的第一个方法,是在ui文件中通过拖拉预设部件制作你需要的界面,然后在每一个界面中编辑控件的样式表。这种方式足够简单,你甚至不需要掌握代码,只需要百度该控件的qss写法,就能在ui文件界面中,直观预览到你想要的效果。

但这种方法随着需求的复杂程度,会越来越鸡肋,例如控件的状态切换和隐藏、窗口最大化的拉伸效果、不小心代码上重新设置了界面,死活找不出样式未能实现的原因等,特别是还遇到了换肤这种麻烦至极的要求,你会痛苦不已。

所以,有很多人并不推荐在ui界面中做过多的样式设置,甚至推荐抛弃ui界面,完全通过代码来实现。但我本人其实是不赞同这种方法的,很多时候不是工具不好用,而是你不会用而已。在我看来,ui界面是qt的一大创新,也是方便开发者的利器,其本质是通过ui文件,生成你需要的头文件,本质上跟你用代码编写是一样的,ui界面只是一个直观的布局工具而已。

既然如此,那就让ui界面仅负责控件的生成和基本布局,其他样式和尺寸设置从中剥离,在代码中实现就可以了。这样一来,将各自的优点保留,还能在界面中直观看到简单的效果。这在团队协作中,是极大便于多人开发的。

2.代码编写

每一个控件类,都有setStyleSheet函数,你可以将样式表写在代码中,通过这个函数设置进去。这种方法的优点是可控制,你可以在合适的实际对控件进行样式重写,比方一个按钮按下之后,需要切换成另外一种样式;有信号和没信号时,label需要切换不同的颜色......这种情况下,你就可以通过代码来灵活设置。

但确定也是有的,那就是你会在代码中内嵌过多的样式表字符串代码,并且随着你软件功能的复杂程度,很可能一个cpp文件,有大半都是样式表字符串。这极大影响了代码的精简程度,也不便于你维护。

但因为某些原因,我在工作中长期将样式表全部写在代码中,在这个过程中,我遇到了许多版本区别,需要针对不同版本更换ui,甚至更换样式图片。随着代码样式表代码疯狂增加,我又不愿意为了单纯的更换ui而拷贝工程代码时......我终于意识到该方案的愚蠢。

3.qss文件加载

如果我们将样式表代码写在一个文件中,程序启动时再读取,然后进行设置,岂不是可以将这些反复的样式表代码与功能代码分离吗?是的,这正是换肤的正确方式,也是不少高手所采用的样式表设置方法。

大家可以试想一下,如何做到像以前电脑qq那样,在皮肤库中下载一个皮肤,我就能做到改变皮肤?那肯定是下载一个文件啊,怎么会是预先把样式表写在代码中呢。

通过这种方法,我们甚至可以把控件的尺寸写在文件中,我都不需要再在代码中给控件设置宽高。

当然,它有不少注意事项,在这里先不赘述。比起上两种方法,它或许没那么方便。但它的条理十分清晰,可扩展性良好。在实际工作项目中,强烈推荐使用。

这种方式,需要对控件设置严格的object name。如果在ui界面中拖拉控件,那控件名默认就是objectname,你也可以进行修改。如果是代码new出来的控件,记得要setObjectName,这个qss中需要用到。

一般来说,程序刚运行,在main刚开始时qApp->setStyleSheet就可以了,但我们不确保不同的界面中,可能会存在相同objectname的控件,但我们又需要他们实现不同的样式。这种情况下,我们大可以编写多个qss,然后在不同界面类的构造函数中this->setStyleSheet。这种方法也能降低单个qss中代码过多难以查找,通过不同界面简单分类。而且降低因为单个qss文件数据过大,导致设置的时候卡顿明显的问题。

如果还有更多分享的,之后会继续发文,感谢大家阅读观看。

相关推荐
周杰伦fans1 分钟前
C# 中 SQL Server 数据库调优指南(小白友好版)
开发语言·数据库·c#
1***y1784 分钟前
PHP在微服务中的微服务开发
开发语言·微服务·php
D_evil__6 分钟前
[C++高频精进] 现代C++特性:Lambda表达式
c++
喜欢吃燃面21 分钟前
算法竞赛中的堆
c++·学习·算法
大吱佬42 分钟前
GO 八股整理(自用)
开发语言·后端·golang
froginwe111 小时前
Go 语言结构体
开发语言
松涛和鸣1 小时前
DAY20 Optimizing VS Code for C/C++ Development on Ubuntu
linux·c语言·开发语言·c++·嵌入式硬件·ubuntu
田里的水稻1 小时前
Python_编程中代码注释相关格式 PEP8 — Python 官方代码风格指南
开发语言·python
一只乔哇噻1 小时前
java后端工程师+AI大模型进修ing(研一版‖day57)
java·开发语言·人工智能·算法·语言模型
Williams101 小时前
Java POI/Excel工具:终结OOM、精度丢失和i18n三大难题
java·开发语言·excel