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

QT全局所有QSS样式实时切换

方法如下:

void loadQss(int qssType)
{QString name;if (qssType == 1)name = ":/qss/day.qss";elsename = ":/qss/night.qss";QFile file(name);file.open(QFile::ReadOnly);QString qss;qss = file.readAll();qApp->setStyleSheet(qss);file.close();
}

为什么qApp->setStyleSheet(qss);可以做到全局所有样式实时切换,我来看下setStyleSheet的源码。

void QApplication::setStyleSheet(const QString& styleSheet)
{//将样式内容保存到内存,以备候用QApplicationPrivate::styleSheet = styleSheet;//获取当前应用程序的样式QStyleSheetStyle *proxy = qobject_cast<QStyleSheetStyle*>(QApplicationPrivate::app_style);//第一个判断条件:如果传入样式为空,则保持当前应该用程序样式if (styleSheet.isEmpty()) { // application style sheet removedif (!proxy)return; // there was no stylesheet beforesetStyle(proxy->base);//如果应用程序已经设置了样式,则只是刷新样式,而不会使用函数传入的样式。//这也就告诉我们,为qApp设置样式前,需要卸载当前样式,之后安装样式才能生效} else if (proxy) { // style sheet update, just repolishproxy->repolish(qApp);//当前qApp没有样式,设置我们传进来的样式} else { // stylesheet set the first timeQStyleSheetStyle *newProxy = new QStyleSheetStyle(QApplicationPrivate::app_style);QApplicationPrivate::app_style->setParent(newProxy);setStyle(newProxy);}
}
void QApplication::setStyle(QStyle *style)
{if (!style || style == QApplicationPrivate::app_style)return;//拿到所有控件,设置它们的样式。		QWidgetList all = allWidgets();// clean up the old styleif (QApplicationPrivate::app_style) {if (QApplicationPrivate::is_app_running && !QApplicationPrivate::is_app_closing) {for (QWidgetList::ConstIterator it = all.constBegin(), cend = all.constEnd(); it != cend; ++it) {QWidget *w = *it;if (!(w->windowType() == Qt::Desktop) &&        // except desktopw->testAttribute(Qt::WA_WState_Polished)) { // has been polished//清除所有老样式QApplicationPrivate::app_style->unpolish(w);}}}QApplicationPrivate::app_style->unpolish(qApp);}QStyle *old = QApplicationPrivate::app_style; // saveQApplicationPrivate::overrides_native_style =nativeStyleClassName() == QByteArray(style->metaObject()->className());#ifndef QT_NO_STYLE_STYLESHEETif (!QApplicationPrivate::styleSheet.isEmpty() && !qobject_cast<QStyleSheetStyle *>(style)) {// we have a stylesheet already and a new style is being setQStyleSheetStyle *newProxy = new QStyleSheetStyle(style);style->setParent(newProxy);QApplicationPrivate::app_style = newProxy;} else
#endif // QT_NO_STYLE_STYLESHEETQApplicationPrivate::app_style = style;QApplicationPrivate::app_style->setParent(qApp); // take ownership// take care of possible palette requirements of certain gui// styles. Do it before polishing the application since the style// might call QApplication::setPalette() itselfif (QApplicationPrivate::set_pal) {QApplication::setPalette(*QApplicationPrivate::set_pal);} else if (QApplicationPrivate::sys_pal) {clearSystemPalette();initSystemPalette();QApplicationPrivate::initializeWidgetPaletteHash();QApplicationPrivate::initializeWidgetFontHash();QApplicationPrivate::setPalette_helper(*QApplicationPrivate::sys_pal, /*className=*/0, /*clearWidgetPaletteHash=*/false);} else if (!QApplicationPrivate::sys_pal) {// Initialize the sys_pal if it hasn't happened yet...QApplicationPrivate::setSystemPalette(QApplicationPrivate::app_style->standardPalette());}// initialize the application with the new style//加载样式QApplicationPrivate::app_style->polish(qApp);// re-polish existing widgets if necessaryif (QApplicationPrivate::is_app_running && !QApplicationPrivate::is_app_closing) {for (QWidgetList::ConstIterator it = all.constBegin(), cend = all.constEnd(); it != cend; ++it) {QWidget *w = *it;if (w->windowType() != Qt::Desktop && w->testAttribute(Qt::WA_WState_Polished)) {if (w->style() == QApplicationPrivate::app_style)QApplicationPrivate::app_style->polish(w);                // repolish
#ifndef QT_NO_STYLE_STYLESHEETelsew->setStyleSheet(w->styleSheet()); // touch
#endif}}for (QWidgetList::ConstIterator it = all.constBegin(), cend = all.constEnd(); it != cend; ++it) {QWidget *w = *it;if (w->windowType() != Qt::Desktop && !w->testAttribute(Qt::WA_SetStyle)) {QEvent e(QEvent::StyleChange);//将新样式应用到所有子控件中QApplication::sendEvent(w, &e);w->update();}}}#ifndef QT_NO_STYLE_STYLESHEETif (QStyleSheetStyle *oldProxy = qobject_cast<QStyleSheetStyle *>(old)) {oldProxy->deref();} else
#endifif (old && old->parent() == qApp) {delete old;}if (QApplicationPrivate::focus_widget) {QFocusEvent in(QEvent::FocusIn, Qt::OtherFocusReason);QApplication::sendEvent(QApplicationPrivate::focus_widget->style(), &in);QApplicationPrivate::focus_widget->update();}
}

通过以上源码我们能看出在qApp的setStyleSheet中会拿到所有控件,清除旧的样式,然后加载新的样式,做到全局所有控件样式的动态切换。

相关文章:

QT全局所有QSS样式实时切换

方法如下&#xff1a; void loadQss(int qssType) {QString name;if (qssType 1)name ":/qss/day.qss";elsename ":/qss/night.qss";QFile file(name);file.open(QFile::ReadOnly);QString qss;qss file.readAll();qApp->setStyleSheet(qss);file.…...

MySQL三大版本的演进

三大版本的演进 文章目录 三大版本的演进一&#xff1a;5.6版本&#xff08;大跃进时期&#xff09;1&#xff1a;支持只读事务2&#xff1a;innodb存储引擎增强2.1&#xff1a;缓冲池刷盘策略优化2.2&#xff1a;BufferPool缓冲池预热 3&#xff1a;新增Performance_Schema库监…...

利用 IMU 估计人体关节轴向和位置 —— 论文推导

Title: 利用 IMU 估计人体关节轴向和位置 —— “Joint axis and position estimation from inertial measurement data by exploiting kinematic constraints” —— 论文推导 文章目录 I. 论文回顾II. 铰接关节的约束1. 铰接关节约束的原理2. 铰接关节约束的梯度3. 铰接关节约…...

脚本一键生成管理下游k8s集群的kubeconfig

一、场景 1.1 需要管理下游k8s集群的场景。 1.2 不希望使用默认的cluster-admin权限的config. 二、脚本 **重点参数&#xff1a; 2.1 配置变量。 1、有单独namespace的权限和集群只读权限。 2、自签名的CA证书位置要正确。 2.2 如果配置错误&#xff0c;需要重新…...

数据库系统概念第六版记录 三

外码约束&#xff08;Foreign Key Constraint&#xff09; 外码&#xff08;Foreign Key, FK&#xff09;是关系数据库中的一个约束&#xff0c;它用于保证表之间的引用完整性。外码的值必须&#xff1a; 要么存在于被引用表的主键列中&#xff0c;要么为空&#xff08;NULL&…...

YOLOv11-ultralytics-8.3.67部分代码阅读笔记-files.py

files.py ultralytics\utils\files.py 目录 files.py 1.所需的库和模块 2.class WorkingDirectory(contextlib.ContextDecorator): 3.def spaces_in_path(path): 4.def increment_path(path, exist_okFalse, sep"", mkdirFalse): 5.def file_age(path__fi…...

微信小程序案例1——制作猫眼电影底部标签导航栏

文章目录 一、项目步骤1 新建一个无AppID的movie项目2将准备好的底部标签导航图标拷贝到movie项目下面(将图标文件夹image放到项目文件夹里&#xff09;3 打开App.json配置文件&#xff0c;在pages数组里添加4个页面路径:电影“pages/movie/movie”、影院“pages/cinema/cinema…...

【大数据技术】搭建完全分布式高可用大数据集群(Kafka)

搭建完全分布式高可用大数据集群(Kafka) kafka_2.13-3.9.0.tgz注:请在阅读本篇文章前,将以上资源下载下来。 写在前面 本文主要介绍搭建完全分布式高可用集群 Kafka 的详细步骤。 注意: 统一约定将软件安装包存放于虚拟机的/software目录下,软件安装至/opt目录下。 安…...

【服务器知识】如何在linux系统上搭建一个nfs

文章目录 NFS网络系统搭建**1. 准备工作****2. 服务器端配置****(1) 安装 NFS 服务****(2) 创建共享目录****(3) 配置共享规则****(4) 生效配置并启动服务****(5) 防火墙配置** **3. 客户端配置****(1) 安装 NFS 客户端工具****(2) 创建本地挂载点****(3) 挂载 NFS 共享目录***…...

图片画质增强:轻松提升画质

前言&#xff1a; 今天给大家推荐一款非常实用的图片画质增强软件&#xff0c;它无需联网即可使用&#xff0c;完全离线操作&#xff0c;这款软件基于先进的深度学习技术&#xff0c;能够对模糊图片进行强大的高清处理&#xff0c;效果令人惊艳。 图片画质增强&#xff1a;一…...

vscode快速接入deepseek 实践操作

背景说明 在deepseek快速火爆的情况下&#xff0c;也想自己体验一把。看看在vscode中集成进来&#xff0c;方便平时的脚本开发。对于年纪大的人还是非常方便的。 操作过程 安装continue 打开vscode进入扩展市场&#xff0c;搜索安装 安装完成就是上面的样子&#xff0c;会…...

mapbox进阶,添加绘图扩展插件,绘制圆形

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️MapboxDraw 绘图控件二、🍀添加绘图扩…...

Cursor 与多语言开发:全栈开发的利器

引言 全栈开发要求开发者跨越前端、后端、数据库甚至数据科学等多个技术领域&#xff0c;而不同技术栈往往需要切换工具和思维方式。Cursor 作为一款 AI 驱动的智能编程助手&#xff0c;凭借其对 20 编程语言 和主流框架的深度支持&#xff0c;正在成为全栈开发的“瑞士军刀”…...

2025 CCF BDCI|“基于TPU平台的OCR模型性能优化”一等奖作品

2024年12月&#xff0c;中国计算机学会在海南博鳌成功举办了第十二届CCF大数据与计算智能大赛&#xff08;简称2024 CCF BDCI&#xff09;。本届比赛的算能赛道吸引了1748名选手报名&#xff0c;经过激烈角逐&#xff0c;北京航空航天大学的“常务副SOTA”团队脱颖而出&#xf…...

FPGA的IP核接口引脚含义-快解

疑问 手册繁琐&#xff0c;怎样快速了解IP核各输入输出接口引脚的含义。 答疑 不慌不慌&#xff0c;手册确实比较详细但繁琐&#xff0c;如何快速知晓该部分信息&#xff0c;涛tao道长给你们说&#xff0c;简单得很&#xff0c;一般新入门的道友有所不知&#xff0c;往往后面…...

数据库高安全—审计追踪:传统审计统一审计

书接上文数据库高安全—角色权限&#xff1a;权限管理&权限检查&#xff0c;从权限管理和权限检查方面解读了高斯数据库的角色权限&#xff0c;本篇将从传统审计和统一审计两方面对高斯数据库的审计追踪技术进行解读。 4 审计追踪 4.1 传统审计 审计内容的记录方式通…...

机器学习 - 需要了解的条件概率、高斯分布、似然函数

似然函数是连接数据与参数的桥梁&#xff0c;通过“数据反推参数”的逆向思维&#xff0c;成为统计推断的核心工具。理解它的关键在于区分“参数固定时数据的概率”与“数据固定时参数的合理性”&#xff0c;这种视角转换是掌握现代统计学和机器学习的基础。 一、在学习似然函…...

Spring Boot Web 入门

目录 Spring Boot Web 是 Spring Boot 框架的一个重要模块&#xff0c;它简化了基于 Spring 的 Web 应用程序的开发过程。以下是一个 Spring Boot Web 项目的入门指南&#xff0c;涵盖了项目创建、代码编写、运行等关键步骤。 1. 项目创建 使用 Spring Initializr 使用 IDE …...

神经网络|(八)概率论基础知识-二项分布及python仿真

【1】引言 前序已经学习了古典概型、条件概率、全概率公式和贝叶斯公式&#xff0c;它们作为基础&#xff0c;解释了事件发生及其概率的对应关系&#xff0c;相关文章链接为&#xff1a; 神经网络|(四)概率论基础知识-古典概型-CSDN博客 神经网络|(五)概率论基础知识-条件概…...

【面试场景】MySQL分布式主键选取

文章目录 一. MySQL的自增主键二. UUID三. 雪花ID(推荐) 我的博客地址 一. MySQL的自增主键 适合单表的情况, 在分布式分库分表下可能会有一些问题 主键冲突问题 在分布式系统中&#xff0c;多个数据库节点独立生成自增主键&#xff0c;很容易出现重复的主键值。例如&#xff…...

Ubuntu 26.04 完美安装和设置

设置 root 用户密码 sudo passwd root Linux安装微软命令行文本编辑器-Microsoft Edit # 安装 Zstandard apt install zstd # 下载软件包 wget https://github.com/microsoft/edit/releases/download/v1.2.0/edit-1.2.0-x86_64-linux-gnu.tar.zst # 解压缩到用户的当前目录…...

微信网页版访问终极指南:wechat-need-web插件完整教程

微信网页版访问终极指南&#xff1a;wechat-need-web插件完整教程 【免费下载链接】wechat-need-web 让微信网页版可用 / Allow the use of WeChat via webpage access 项目地址: https://gitcode.com/gh_mirrors/we/wechat-need-web 还在为无法在浏览器中使用微信网页版…...

基于CircuitPython与伺服电机的自动调光眼镜制作指南

1. 项目概述与核心思路 最近在整理工作室的零件盒&#xff0c;翻出来一块Adafruit的Circuit Playground Express开发板和几个闲置的微伺服电机。看着窗外刺眼的阳光&#xff0c;我忽然想到&#xff0c;能不能用这些手头的“边角料”做个实用的小玩意儿&#xff1f;于是&#x…...

【实战排错】Vivado 综合卡死与“PID not specified”的深度诊断与修复

1. 故障现象与初步排查 最近在跑Vivado综合时&#xff0c;突然遇到一个让人头疼的问题&#xff1a;综合进程莫名其妙卡死&#xff0c;日志里还跳出"PID not specified"的错误提示。这种情况相信不少FPGA工程师都遇到过&#xff0c;特别是项目紧急的时候&#xff0c;这…...

Git 查看某个文件的修改记录

Git 查看某个文件的修改记录 git log – filename filename为全路径 git log – aa/bb/cc/dd/ee/ff.c...

强化学习优化文本生成:从原理到实战,打造可控AI创作工具

1. 项目概述&#xff1a;当强化学习遇上文本生成如果你玩过AI绘画&#xff0c;一定对“提示词工程”不陌生——通过精心设计的文字描述&#xff0c;让模型画出你想要的画面。但你是否想过&#xff0c;这个过程本身也可以被“优化”&#xff1f;比如&#xff0c;你希望模型生成一…...

LDAP认证失败率下降92%!DeepSeek集成最佳实践,含OpenLDAP/Active Directory双环境配置清单

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;LDAP认证失败率下降92%&#xff01;DeepSeek集成最佳实践&#xff0c;含OpenLDAP/Active Directory双环境配置清单 在企业级AI平台落地过程中&#xff0c;统一身份认证是安全与体验的基石。DeepSeek模型…...

基于Circuit Playground Express与MakeCode的动感火焰球DIY制作全攻略

1. 项目概述&#xff1a;打造你的专属动感火焰球如果你玩过《魔兽世界》&#xff0c;一定对凯尔萨斯逐日者手中那团标志性的魔法火焰印象深刻&#xff1b;或者&#xff0c;你也曾幻想过像马里奥兄弟一样&#xff0c;投掷出酷炫的火球。现在&#xff0c;这个幻想可以变成你Cospl…...

开源安全工具openclaw-killer:Nginx Lua环境威胁检测与防护实践

1. 项目概述&#xff1a;一个开源安全工具的诞生与使命最近在安全研究圈子里&#xff0c;一个名为openclaw-killer的项目引起了我的注意。这个由nkzprod维护的开源工具&#xff0c;名字就透着一股“杀气”——“OpenClaw杀手”。乍一看&#xff0c;你可能会以为这是某个游戏外挂…...

DeepSeek MMLU 86.7分是怎么炼成的?从提示工程、校准策略到知识蒸馏链路(内部训练日志首次公开)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;DeepSeek MMLU 86.7分的里程碑意义与基准解读 MMLU 基准的本质与挑战 MMLU&#xff08;Massive Multitask Language Understanding&#xff09;是一项覆盖57个学科领域的综合性评测基准&#xff0c;涵…...