Qt开发经验 --- Qt 修改控件样式的方式(16)

文章目录

    • @[toc]
    • 1 概述
    • 2 Qt Style Sheets (QSS)
    • 3 使用 QStyle 和 QProxyStyle
    • 4 设置 Palette (调色板)
    • 5 使用预定义的 QStyle
    • 6 直接设置控件属性
    • 7 自定义控件绘制

更多精彩内容
👉内容导航 👈
👉Qt开发经验 👈

1 概述

Qt 提供了多种修改控件样式的方式,以下是主要的几种方法:

各方法的特点对比

方法优点缺点适用场景
QSS简单易用,类似CSS,可集中管理性能略低,调试困难快速界面美化,
大部分UI样式需求
QStyle性能好,控制精确复杂,需了解绘制细节深度定制外观
Palette简单,性能好功能有限,主要控制颜色简单颜色修改
属性设置直观,易理解零散,不易维护单个控件快速调整
自定义绘制(paintEvent)完全控制复杂,维护困难特殊UI需求

推荐使用策略

  1. 简单样式调整:使用 QSS
  2. 整体风格定制:使用 QStyle 或 QProxyStyle
  3. 颜色主题切换:使用 Palette
  4. 特殊控件外观:自定义绘制
  5. 项目级样式管理:QSS 文件 + 资源系统

2 Qt Style Sheets (QSS)

Qt样式表是最常用和灵活的样式修改方式,语法类似于CSS。

使用方式

  • 全局应用:通过 QApplication::setStyleSheet()

  • 窗口级别:通过 QWidget::setStyleSheet()

  • 控件级别:直接对特定控件设置样式

// 直接在代码中设置
QPushButton *button = new QPushButton("按钮");
button->setStyleSheet("QPushButton {""background-color: blue;""color: white;""border-radius: 5px;""padding: 10px;""}");// 或者应用到整个应用程序
QApplication::setStyleSheet("QPushButton { background-color: red; }");

3 使用 QStyle 和 QProxyStyle

通过继承或代理 QStyle 来改变控件的绘制方式:

   // 使用 QProxyStyle 自定义样式class CustomStyle : public QProxyStyle{public:void drawControl(ControlElement element, const QStyleOption *option,QPainter *painter, const QWidget *widget) const override{if (element == CE_PushButton) {// 自定义按钮绘制逻辑} else {QProxyStyle::drawControl(element, option, painter, widget);}}};// 应用样式QApplication::setStyle(new CustomStyle);

4 设置 Palette (调色板)

通过修改控件的调色板来改变颜色:

QPalette palette;
palette.setColor(QPalette::Button, QColor(255, 0, 0));      // 按钮背景色
palette.setColor(QPalette::ButtonText, QColor(255, 255, 255)); // 按钮文字颜色QPushButton *button = new QPushButton("按钮");
button->setPalette(palette);
button->setAutoFillBackground(true);  // 必须启用自动填充背景

5 使用预定义的 QStyle

Qt 提供了几种内置样式:

  // 设置系统默认样式QApplication::setStyle(QStyleFactory::create("Fusion"));     // 现代风格QApplication::setStyle(QStyleFactory::create("Windows"));    // Windows 风格QApplication::setStyle(QStyleFactory::create("Macintosh"));  // Mac 风格// 或者为特定控件设置样式widget->setStyle(QStyleFactory::create("Windows"));

6 直接设置控件属性

通过控件自身的属性方法设置外观:

  QPushButton *button = new QPushButton("按钮");button->setStyleSheet("background-color: red; color: white;");  // 样式表button->setFont(QFont("Arial", 12, QFont::Bold));              // 字体button->setFixedSize(100, 30);                                 // 大小button->setCursor(Qt::PointingHandCursor);                     // 光标

7 自定义控件绘制

重写控件的 paintEvent() 方法:

   class CustomWidget : public QWidget{protected:void paintEvent(QPaintEvent *event) override{QPainter painter(this);painter.setBrush(Qt::blue);painter.drawRect(rect());// 自定义绘制逻辑}};

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

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

相关文章

Vue3》》Svg图标 封装和使用

SVG 安装插件 npm i vite-plugin-svg-icons // vite.config.ts import { defineConfig } from vite import vue from vitejs/plugin-vue import { createSvgIconsPlugin } from vite-plugin-svg-icons import { resolve } from path export default defineConfig({//配置路径别…

【04】AI辅助编程完整的安卓二次商业实战-寻找修改替换新UI首页图标-菜单图标-消息列表图标-优雅草伊凡

【04】AI辅助编程完整的安卓二次商业实战-寻找修改替换新UI首页图标-菜单图标-消息列表图标-优雅草伊凡引言本次二开布局没有变,但是下一次整体布局会有变,不过本次开发发现朋友圈跳转功能的流程步骤也做了一定的变化。原生项目复杂就复杂于就算一个颜色…

龙蜥8.10中spark各种集群及单机模式的搭建spark3.5.6(基于hadoop3.3.6集群)

先说最终的访问端口,如我这里ip为172.20.94.37、172.20.94.38、172.20.94.39,主机名分别为:hadoop37、hadoop38、hadoop39. 最终访问(默认端口): hadoop webui 172.20.94.37:9870 hdfs 端口 8020 yarn 172.…

关于我重新学习 react 的第一遍

今天是25年9月11号,很久很久没有学习前端知识了,坦诚来说还清楚记得在大学里因为前端技术第一次获奖的心情,也清晰记得写完第一篇博客后的心情,工作和运动给我最大程度的成就感。 打破自己 重新开始 完全地 版本一 25.9.11 文章目…

第2课:Agent系统架构与设计模式

第2课:Agent系统架构与设计模式 课程目标 理解Agent的基本概念和特性掌握多Agent系统的设计模式学习Agent通信协议和消息传递实践创建简单的Agent框架 课程内容 2.1 Agent基础概念 什么是Agent? Agent是一个具有自主性、反应性、社会性和主动性的计…

Day42 51单片机中断系统与8×8 LED点阵扫描显示

day42 51单片机中断系统与88 LED点阵扫描显示一、51单片机引脚位操作 —— sbit 关键字 作用 sbit 是专用于 51 单片机架构的 C 语言扩展关键字,用于定义特殊功能寄存器(SFR)中的某一位,从而实现对单个 I/O 引脚的直接位操作。 示…

差分: 模板+题目

题目:【模板】差分 应用场景:快速解决将某一个区间所有元素加上 “一个数” 的操作。 第一步,预处理差分数组。 f[i] 表示:当前元素与前一个元素的差值 a[i] - a[i-1]; 但在题目中,我们其实可以不用到a[]这个数组…

GD32 Timer+ADC多通道+DMA+PWM调试记录

本例记录使用GD32307C开发板,实现以内部Timer1 CH1为触发源,触发ADC0的两个通道,进行并行非连续采样,病通过DMA传输采样结果。同时输出PWM,用来检测Timer1 CH1的触发周期。下面介绍具体实现过程:1. gpio初始…

阻塞 IO为什么叫BIO,非阻塞IO为什么叫NIO,异步IO为什么叫AIO

IOIO的核心就是数据传输,也就是程序与外部设备之间进行传输,通过IO的核心可以分为,文件IO和网络IO文件IO交互的对象就是本地存储设备,比方说读写本地文件。网络IO交互的对象就是网络设备,核心的应用场景就是网络通信。…

10分钟了解什么是多模态大模型

10分钟了解什么是多模态大模型(MM-LLMs) 1. 什么是多模态 Multimodality 多模态(Multimodality)是指集成和处理两种或两种以上不同类型的信息或数据的方法和技术。在机器学习和人工智能领域,多模态涉及的数据类型通常…

通过DSL生成Jenkins流水线

代码化管理 Jenkins 流水线(Infrastructure as Code) 版本控制:DSL 脚本可以像代码一样存入 Git、GitLab 等版本控制系统,所有任务配置的变更都有提交记录,便于追溯历史、回滚错误。协作效率:团队成员可以通…

信号量主要API及综合应用

1.信号量概述信号量是一个底层核心模块【int】类型变量,记录当前信号量数据。信号量 P 操作 (sem_wait)线程检测对应信号量底层 int 数据数值,如果大于 0,当前线程获得 CPU 执行权,同时将信号量底层 int 数据-1 操作。如果底层数据…

工业自动化领域的“超级跑车”:西门子TDC系统深度解析与实战架构

工业自动化领域的“超级跑车”:西门子TDC系统深度解析与实战架构 文章目录 工业自动化领域的“超级跑车”:西门子TDC系统深度解析与实战架构引言:当普通PLC遇到性能瓶颈第一章:认识TDC——它不是简单的“大型PLC”1.1 TDC究竟是什…

MySQL高阶查询语句与视图实战指南

MySQL高阶查询语句与视图实战指南 文章目录MySQL高阶查询语句与视图实战指南一、常用高阶查询技巧1. 按关键字排序(ORDER BY)基础用法进阶用法:多字段排序条件过滤2. 区间判断与去重(AND/OR DISTINCT)区间判断&#x…

解决Pytest参数化测试中文显示乱码问题:两种高效方法

在使用Pytest进行参数化测试时,许多开发者都会遇到一个常见但令人头疼的问题:当测试用例的ids参数包含中文字符时,控制台输出会出现乱码。这不仅影响了测试报告的可读性,也给测试结果的分析带来了困难。本文将深入探讨这个问题&am…

基于SpringBoot的校园流浪动物救助平台【spring boot实战项目、Java毕设、Java项目、Java实战】

💖💖作者:计算机毕业设计小途 💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长Java、微信小程序、Python、Golang、安卓Android等,开发项目包括…

利用kimi k2编写postgresql协议服务端的尝试

美团龙猫还是很有自知之明的 提问请用C编写postgresql协议服务端,能接收psql客户端或其他采用postgresql协议的工具的请求,实现将用户请求打印在控制台,并把回应发给客户端回答 抱歉,我无法为您编写完整的 PostgreSQL 协议服务端。…

医疗 AI 再突破:辅助诊断准确率超 90%,但落地医院仍面临数据安全与临床信任难题

一、引言(一)医疗 AI 发展背景在数字化与智能化浪潮的席卷下,医疗领域正经历着深刻变革,人工智能(AI)技术的融入成为这场变革的关键驱动力。近年来,医疗 AI 辅助诊断技术取得重大突破&#xff0…

Rocky Linux10.0安装zabbix7.4详细步骤

安装Rocky Linux10.0系统 请参考Rocky Linux10.0安装教程-CSDN博客 查看当前系统版本 cat /etc/*release 安装数据库 安装zabbix之前,需要先安装一个数据库来承载zabbix的数据。这里我选择在本机直接安装一个MariaDB数据库。 Rocky Linux10.0系统默认不包含MySQ…

JDBC插入数据

文章目录视频:JDBC插入数据环境准备写插入数据属性配置属性配置视频:JDBC插入数据 环境准备 MySQL环境 小皮面板 提供MySQL环境 写插入数据 属性配置 声明变量 属性配置 # . properties 是一个特俗的map 集合 # key : 字符串 value : 字符串…