当前位置: 首页 > news >正文

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

相关文章:

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

如果你对Qt有基本的了解,应该知道它的一大优点是跨平台,可以在不同的系统中编译运行。但在我看来,Qt还有另外一个优点,就是制作界面比较方便和灵活,能够实现主流静态效果的桌面应用。(如果需要实现比较灵动…...

软件测试(测试用例详解)(三)

1. 测试用例的概念 测试用例(Test Case)是为了实施测试而向被测试的系统提供的一组集合。 测试环境操作步骤测试数据预取结果 测试用例的评价标准: 用例表达清楚,无二义性。。用例可操作性强。用例的输入与输出明确。一条用例只有…...

最优算法100例之33-字符串/数字的排列组合问题

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 字符串/数字的排列组合问题 void dfs(int deep){if(deep == n){//输出}for(int i = 0; i < n; i++){if(flag[i] == 0){d[d…...

Java面试题:请解释Java中的多线程编程?

Java中的多线程编程允许 concurrently 执行多个线程&#xff0c;从而可以同时执行多个任务&#xff0c;提高程序的效率和响应性。在Java中&#xff0c;线程可以通过以下两种主要方式来实现&#xff1a; 继承 Thread 类实现 Runnable 接口 继承 Thread 类 class MyThread ext…...

acwing算法提高之图论--最小生成树的扩展应用

目录 1 介绍2 训练 1 介绍 本专题用来记录使用最小生成树算法&#xff08;prim或kruskal&#xff09;解决的扩展题目。 2 训练 题目1&#xff1a;1146新的开始 C代码如下&#xff0c; #include <iostream> #include <cstring> #include <algorithm>usin…...

政安晨:【Keras机器学习实践要点】(十七)—— 利用 EfficientNet 通过微调进行图像分类

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 本文目标&#xff1a; 使用 EfficientNet 和在图…...

wordpress全站开发指南-面向开发者及深度用户(全中文实操)--php函数

php函数 wordpress会封装一部分函数&#xff0c;比如bloginfo该函数的作用是直接调用你设置的你的网站的名称 示例 This is our amazing custom theme <?php echo 22; function myfirstfunction(){ echo 33; echo "<p>Hello ,this is my first function</…...

Linux 设备驱动管理之内核对象(Kernel Object)机制

Linux 设备驱动管理之内核对象(Kernel Object)机制 Linux内核是一个复杂的系统&#xff0c;它通过一系列的机制和结构体来管理和表示系统中的资源。其中一个关键的概念是“内核对象”&#xff08;Kernel Object&#xff0c;简称kobject&#xff09;。本文将深入探讨kobject机制…...

【C语言】关键字选择题

前言 题目一&#xff1a; 题目二&#xff1a; 题目三&#xff1a; 题目四&#xff1a; 题目五&#xff1a; 题目六&#xff1a; 前言 关于C语言关键字相关的选择题 题目一&#xff1a; 用在switch语言中的关键字不包含哪个&#xff1f;( ) A .continue B .break C .defa…...

营销中的归因人工智能

Attribution AI in marketing 归因人工智能作为智能服务的一部分&#xff0c;是一种多渠道算法归因服务&#xff0c;根据特定结果计算客户互动的影响和增量影响。有了归因人工智能&#xff0c;营销人员可以通过了解每个客户互动对客户旅程每个阶段的影响来衡量和优化营销和广告…...

ChatGPT 的核心 GPT 模型:探究其生成式预训练变换架构的革新与应用潜力

GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型是一种深度学习模型&#xff0c;由OpenAI于2018年首次提出&#xff0c;并在随后的几年中不断迭代发展&#xff0c;包括GPT-2、GPT-3以及最新的GPT-4。GPT模型在自然语言处理&#xff08;NLP&#xff09;领域…...

Python | Leetcode Python题解之第10题正则表达式匹配

题目&#xff1a; 题解&#xff1a; class Solution:def isMatch(self, s: str, p: str) -> bool:m, n len(s), len(p)dp [False] * (n1)# 初始化dp[0] Truefor j in range(1, n1):if p[j-1] *:dp[j] dp[j-2]# 状态更新for i in range(1, m1):dp2 [False] * (n1) …...

华大单片机新建工程步骤

1.新建文件夹&#xff0c;比如00_LED 2.拷贝 hc32f460_ddl_Rev2.2.0\driver 到 00_LED 3.拷贝 hc32f460_ddl_Rev2.2.0\mcu\common 到 00_LED 4.拷贝 hc32f460_ddl_Rev2.2.0\example\ev_hc32f460_lqfp100_v2\gpio\gpio_output\source 到 00_LED 5.拷贝 hc32f460_ddl_Rev2.2.…...

设计模式:桥接模式

定义 桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象与实现分离,使它们可以独立地变化。在桥接模式中,抽象部分(Abstraction)包含对实现部分(Implementor)的引用,实现部分可以通过接口中的方法被抽象部分使用,但是具体的实现细节对于抽象部分来说是隐藏的…...

人脸识别:Arcface--loss+code

之前只接触过传统方法的人脸识别算法&#xff0c;本以为基于深度学习的方法会使用对比损失之类的函数进行训练&#xff0c;但是Arcface算法基于softmax进行了创新&#xff0c;本文未深究其详细的loss公式原理&#xff0c;在大致明白其方向下&#xff0c;运行了代码&#xff0c;…...

Linux-程序地址空间

目录 1. 程序地址空间分布 2. 两个问题 3. 虚拟地址和物理地址 4. 页表 5. 解决问题 6. 为什么要有地址空间 1. 程序地址空间分布 测试一下&#xff1a; #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/types.h>int ga…...

adobe stock会员开通付费付款订阅充值教程/adobe stock免费白嫖一个月

登录adobe stock的官网&#xff0c;点击你想要下载的视频&#xff0c;然后点击免费下载&#xff0c;我们点击免费试用按钮&#xff0c;可以看到非常贵&#xff0c;需要80美金一个月&#xff0c;用fomepay可以免费白嫖一个月 点击获取一张虚拟信用卡&#xff0c;就可以白嫖一个…...

Mysql的基本命令

1 服务相关命令 命令描述systemctl status mysql查看MySQL服务的状态systemctl stop mysql停止MySQL服务systemctl start mysql启动MySQL服务systemctl restart mysql重启MySQL服务ps -ef | grep mysql查看mysql的进程mysql -uroot -hlocalhost -p123456登录MySQLhelp显示MySQ…...

leetcode.24. 两两交换链表中的节点

题目 给定一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后的链表。 你不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的进行节点交换。 思路 创建虚拟头节点&#xff0c;画图&#xff0c;确认步骤。 实现 /*** Definition for singly-li…...

后端开发框架Spring Boot快速入门

写在前面 推荐将本文与Spring Boot 相关知识和工具类一文结合起来看&#xff0c;本文为主&#xff0c;上面那篇文章为辅&#xff0c;一起食用&#xff0c;以达到最佳效果&#xff0c;当然&#xff0c;大佬随意。 IDEA创建Spring Boot工程 关于Spring Boot框架项目&#xff0…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...