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文件数据过大,导致设置的时候卡顿明显的问题。
如果还有更多分享的,之后会继续发文,感谢大家阅读观看。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/791021.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4款免费可用的数据集成平台亮点

在众多免费的数据集成工具中,我们选出了四个平台,它们分别是Apache Nifi、FineDataLink、kettle、ETLCLoud。现在,让我们快速浏览一下这四个平台的亮点。 Apache Nifi: Apache NiFi 是一款强大的数据集成和处理平台,它…

DockerFile启动jar程序

1.创建Dockerfile 在项目的根目录下创建一个名为Dockerfile的文件,并使用文本编辑器打开它。Dockerfile的内容如下: # 基础镜像 FROM openjdk:8-jre # 创建目录 RUN mkdir -p /usr/app/ # 设置工作目录 WORKDIR /usr/app # 将JAR文件复制到容器中,注:…

算法整理:排序

快速排序 首先不妨以第一个数为基准数&#xff0c;在一轮遍历后&#xff0c;使基准数左边的数都小于基准数&#xff0c;基准数右边的数都大于基准数。 当然也可以取中间的数为基准数。 void quick_sort(vector<int>&nums,int l,int r){if(l>r)return;int idxl;//…

硬件工程师职责与核心技能有哪些?

作为一个优秀的硬件工程师&#xff0c;必须要具备优秀的职业技能。那么&#xff0c;有些刚入行的工程师及在校的学生经常会问到&#xff1a;硬件工程师需要哪些核心技能&#xff1f;要回答这个问题&#xff0c;首先要明白硬件工程师的职责&#xff0c;然后才能知道核心技能要求…

神经网络学习笔记10——RNN、ELMo、Transformer、GPT、BERT

系列文章目录 参考博客1 参考博客2 文章目录 系列文章目录前言一、RNN1、简介2、模型结构3、RNN公式分析4、RNN的优缺点及优化1&#xff09;LSTM是RNN的优化结构2&#xff09;GRU是LSTM的简化结构 二、ELMo1、简介2、模型结构1&#xff09;输入2&#xff09;左右双向上下文信…

Gemini即将收费,GPT无需注册?GPT3.5白嫖和升级教程

&#x1f310;Gemini 即将开始收费 开发者“白嫖”的好日子到头了 - Gemini将开始收费&#xff0c;影响使用Google AI for Developers提供的Gemini API的用户。 - Gemini API将引入按量付费定价&#xff0c;需要注意新的服务条款。 - 用户需在5月2日之前停止使用Gemini API和Go…

使用Java拓展本地开源大模型的网络搜索问答能力

背景 开源大模型通常不具备最新语料的问答能力。因此需要外部插件的拓展&#xff0c;目前主流的langChain框架已经集成了网络搜索的能力。但是作为一个倔强的Java程序员&#xff0c;还是想要用Java去实现。 注册SerpAPI Serpapi 提供了多种搜索引擎的搜索API接口。 访问 Ser…

Linux初学(十三)中间件

一、Nginx 简介 Nginx是一个高性能的HTTP和反向代理web服务器 轻量级、高性能 1.1 Nginx安装 方法一&#xff1a;编译安装 依赖&#xff1a;openssl-devel、zlib-devel、ncurses-devel、pcre-devel、gcc、gcc-c 方法二&#xff1a;yum安装 Nginx的rpm包在epel源中 编译安…

2024.3.10力扣每日一题——猜数字游戏

2024.3.10 题目来源我的题解方法一 哈希表方法二 使用数组优化 题目来源 力扣每日一题&#xff1b;题序&#xff1a;299 我的题解 方法一 哈希表 使用哈希表记录secret中每个数字出现的次数&#xff0c;然后遍历guess的每一位&#xff0c;再判断与secret对应位置是否相同&am…

数据结构(二)----线性表(顺序表,链表)

目录 1.线性表的概念 2.线性表的基本操作 3.存储线性表的方式 &#xff08;1&#xff09;顺序表 •顺序表的概念 •顺序表的实现 静态分配&#xff1a; 动态分配&#xff1a; 顺序表的插入&#xff1a; 顺序表的删除&#xff1a; 顺序表的按位查找&#xff1a; 顺序…

自我认识的方法模型图

在漫长的人生旅途中&#xff0c;我们都在不断地探索、追寻&#xff0c;努力寻找那个最真实、最完整的自我。因为只有真正了解自己&#xff0c;才能战胜内心的种种困惑与恐惧&#xff0c;进而战胜外在的一切挑战与困难。自我认识&#xff0c;是每个人成长的必经之路&#xff0c;…

探索未来外贸电商系统的创新架构

在全球化、数字化的时代背景下&#xff0c;外贸电商行业呈现出蓬勃发展的态势。为了适应市场竞争的激烈和用户需求的多样化&#xff0c;外贸电商系统的架构设计显得尤为重要。本文将深入探讨未来外贸电商系统的创新架构&#xff0c;以期为行业发展提供新的思路和方向。 随着全…

使用Flutter创建带有图标提示的TextField

在移动应用开发中&#xff0c;TextField是一种常用的用户输入小部件。然而&#xff0c;有时向用户提供有关他们应该输入什么的提示或说明是很有帮助的。在本教程中&#xff0c;我们将创建一个Flutter应用程序&#xff0c;演示如何在TextField旁边包含一个图标提示。 编写代码 …

初次在 GitHub 建立仓库以及公开代码的流程 - 公开代码

初次在 GitHub 建立仓库以及公开代码的流程 - 公开代码 References 在已有仓库中添加代码并公开。 git clone 已有仓库 将已有仓库 clone 到本地的开发环境中。 strongforeverstrong:~$ mkdir github_work strongforeverstrong:~$ cd github_work/ strongforeverstrong:~/git…

【.NET全栈】.NET全栈学习路线

一、微软官方C#学习 https://learn.microsoft.com/zh-cn/dotnet/csharp/tour-of-csharp/ C#中的数据类型 二、2021 ASP.NET Core 开发者路线图 GitHub地址&#xff1a;https://github.com/MoienTajik/AspNetCore-Developer-Roadmap/blob/master/ReadMe.zh-Hans.md 三、路线…

把标注数据导入到知识图谱

文章目录 简介数据导入Doccano标注数据&#xff0c;导入到Neo4j寻求帮助 简介 团队成员使用 Doccano 标注了一些数据&#xff0c;包括 命名实体识别、关系和文本分类 的标注的数据&#xff1b; 工作步骤如下&#xff1a; 首先将标注数据导入到Doccano&#xff0c;查看一下标注…

Idea2023创建Servlet项目

① Java EE 只是一个抽象的规范&#xff0c;具体实现称为应用服务器。 ② Java EE 只需要两个包 jsp-api.jar 和 servlet-api.jar&#xff0c;而这两个包是没有官方版本的。也就是说&#xff0c;Java 没有提供这两个包&#xff0c;只提供了一个规范。那么这两个包是谁提供的…

逻辑回归(Logistic Regression)详解

逻辑回归&#xff08;Logistic Regression&#xff09;是一种常用的统计学习方法&#xff0c;用于解决二分类问题。虽然名字中包含“回归”&#xff0c;但逻辑回归实际上是一种分类算法&#xff0c;而不是回归算法。它的基本原理是使用逻辑函数&#xff08;也称为Sigmoid函数&a…

【TI毫米波雷达】IWR6843AOP的官方文件资源名称BUG,选择xwr68xx还是xwr64xx,及需要注意的问题

【TI毫米波雷达】IWR6843AOP的官方文件资源名称BUG&#xff0c;选择xwr68xx还是xwr64xx&#xff0c;及需要注意的问题 文章目录 demo工程out_of_box文件调试bin文件名称需要注意的问题附录&#xff1a;结构框架雷达基本原理叙述雷达天线排列位置芯片框架Demo工程功能CCS工程导…

大模型学习笔记八:手撕AutoGPT

文章目录 一、功能需求二、演示用例三、核心模块流程图四、代码分析1&#xff09;Agent类目录创建智能体对象2&#xff09;开始主流程3&#xff09;在prompt的main目录输入主prompt和最后prompt4&#xff09;增加实际的工具集tools&#xff08;也就是函数&#xff09;5&#xf…