使用PySide6/PyQt6实现自定义窗口布局,实现类似FluentWindow效果

news/2025/10/19 20:07:52/文章来源:https://www.cnblogs.com/wuhuacong/p/19143622

使用PySide6/PyQt6实现自定义窗口布局,实现类似FluentWindow效果

现在在很多项目中,会比较喜欢FluentWindow效果,这种左侧类似于图标菜单或者树形结构的,右侧是是动态窗体或者组件的展示方式,一般不是多文档布局,每次只是打开当前的模块页面,类似于堆叠页面卡片,每次展示最顶端的那个卡片界面。本篇随笔综合介绍一下FluentWindow效果界面的各种展示方式,然后分析页面的内容组成方式,针对性的使用PySide6/PyQt6实现自定义窗口布局的效果。

1、FluentWindow效果界面介绍

在我们的WPF开发框架中,界面布局UI基于lepoco/wpfui(https://github.com/lepoco/wpfui),它的布局也类似于这个FluentWindow的风格,如下所示。

以及一些微软的WPF应用界面(Fluent 主题 https://learn.microsoft.com/zh-cn/dotnet/desktop/wpf/whats-new/net90),也是类似如此的。

或者类似 WinUI 3 Gallery(https://github.com/microsoft/WinUI-Gallery)也是类似的主题风格。

image

以及WPF界面项目 lepoco/wpfui(https://github.com/lepoco/wpfui)
image

 本文主要是针对Python开发领域,对使用PySide6/PyQt6实现自定义窗口布局的探讨,因此也注意PyQt-Fluent-Widgets (https://github.com/zhiyiYo/PyQt-Fluent-Widgets)这个界面组件的实现效果,非常不错,因此对它的实现方式和组合界面的方式进行了一定的研究学习。

image

 2、界面布局的分析

在对这些界面大致了解后,心里希望模拟他们的实现方式,构造一个类似的自定义窗口布局,其中参考上面组件的作者的图示进行分析下。

image

左侧的导航栏部分,分为了上中下三个部分,其中导航的滚动布局部分,主要就是用来放置一些比较长内容,如列表或者树控件等内容的。

而右侧的内容区域,主要使用QStackWidget的堆叠式组件,类似于卡片集合,每次显示最顶部的一张。

为了使得标题栏和整个窗体的样式一致化,我们需采用无边框的窗口处理,这个可以采用 PySideSix-Frameless-Window(zhiyiYo / PyQt-Frameless-Window),或者参考项目yjg30737pyqt-frameless-window(https://github.com/yjg30737/pyqt-frameless-window),两者都可以。

为了更好的对标题栏进行扩展管理,我参考后者项目进行了修改,并增加了对MacOS和Linux的效果支持(yjg30737pyqt-frameless-window 只有Windows实现,没有MacOS等效果) 。

自定义按钮组件:

界面了无边框窗口的实现后,我们来看看左侧导航栏的实现,首先我们需要把左侧拆分为一个按钮条,其中自定义按钮组件,需要符合下面几个效果,里面包含:

  • 一个 QLabel 作为背景线条(选中标志)

  • 一个图标(QLabel/QPushButton/QToolButton 等)

  • 选中时:背景色变浅

  • 未选中时:恢复正常

  • 鼠标悬停时:有特殊效果(hover 效果)

在 PySide6 里,我们可以通过自定义 QWidget 来实现。其中整个按钮组为单选组(像单选按钮一样,点击一个自动取消其他的选中,或者叫做互斥选择组) 管理类,从而组合上面所说的自定义按钮组件。

image

 有了上面的自定义按钮组件(MySelectableItem)和 互斥选择组组件(MySelectableGroup),我们就可以简单完成了导航按钮栏目的设计了,类似下面的效果,实现选择、悬停、移动鼠标进入的样式不同变化

image

 

内容区组件:

QStackedWidget 是 Qt 里专门用来管理 多个页面/界面 的容器控件,它是Qt框架中的一个堆栈窗口控件,用于在同一空间内堆叠多个子控件(或称“页面”),但一次只显示其中一个。它常用于创建多页面或多视图的应用程序,比如设置向导、选项卡界面(尽管它本身不带选项卡标签)和复杂的表单。 

image

 

它的工作方式有点像 卡片堆叠

  • 一次只显示一个子界面;

  • 可以通过索引(int)或者 widget 实例切换显示的页面;

  • 常用于多页面界面切换(比如“设置/主页/详情”之间切换)。

3、使用PySide6/PyQt6实现自定义窗口布局的效果

Window系统的普通的亮色模式下的效果如下所示。

image

如果单击折叠按钮,可以看到效果。

image

 

 如果切换到Windows深色模式下,窗体颜色变为黑色,同时字体颜色对应变化为亮色一些

image

 如果切换到全屏模式下,顶部居中位置有全屏退出提示【按ESC键退出】,效果如下

image

 而MacOS样式,仿照标题栏左侧放置常规按钮,悬停的时候出现按钮图标效果,如下所示。

image

 

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

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

相关文章

读书日记1

今天怀着敬畏之心开始阅读这部被誉为"程序员圣经"的经典著作。《代码大全2》的开篇就给我带来了强烈的思想冲击,让我重新审视自己对软件开发的认知。 核心收获与深刻见解: 1.软件构建的核心地位:McConnel…

对拍教程(自用)

写在前面: 没有掌握对拍啊,每次都是上网贺别人的代码,写一份自己用吧。 对拍,是一个比较实用的工具。它能够非常方便地对于两个程序的输出文件进行比较,可以帮助我们实现一些自动化的比较输出结果的问题。 Step1:…

物理AI:智能自动化的下一个前沿

本文探讨了人工智能与物理系统融合的技术趋势,详细介绍了物理AI的能力层级、关键技术架构以及在制造业、医疗等领域的实际应用案例,展现了从基础自动化到完全自主系统的技术演进路径。物理AI:连接数字智能与物理现实…

Write To Spreadsheet labview这是什么

Write To Spreadsheet labview这是什么很好,这个问题问得很具体。你提到的:Write To Spreadsheet(LabVIEW) 是什么?✅ 简单一句话解释:“Write To Spreadsheet File.vi” 是 LabVIEW 里用来把数据写入文本文件(…

2025/10/19

2025/10/19学习算法

tryhackme-预安全-网络基础知识-局域网介绍-05

tryhackme-Pre Security-Pre Security-Network Fundamentals-Intro to LAN 房间地址:https://tryhackme.com/room/introtolan (该房间需要订阅,关于付费问题。咸鱼OSINT tryhackme即可。) 这是网络安全入门的基础模…

从众多知识汲取一星半点也能受益匪浅【day16(2025.10.18)】(加班但只加到四点半)

Q26.整理工作清单时遇到的问题现象:做了纯样式页面,准备整理清单补充功能逻辑时发现,没有一下子找出原本对照的页面在哪 原因:把对照页面的路径写在了其他地方,没有写在清单上方便对照查看寻找 解决:找到对照页面…

(个人思考)游戏技能的实现

游戏技能实现的三种方式: 1.类似UE中GAS的方式,统一为Ability,并且不处理任何数据逻辑。 https://github.com/No78Vino/gameplay-ability-system-for-unity 2.类似双影其境那种, 简单直观,每个Ability都是独立处理…

模拟赛T4 分析

题目概述 随机 \(2n\) 个数,值域为 \([0,m]\),求前 \(n\) 个数比后 \(n\) 个数大的概率(对质数 \(P\) 取模),其中 \(10^8\leq P\leq 10^9\)。 数据范围:\(1\leq n,m,T\leq 2000\)。 分析 好好玩。 显然可以转化为…

UUT = Unit Under Test

UUT = Unit Under Test✅ 正确答案: UUT = Unit Under Test🔍 拆解一下:缩写全称含义U Unit 单元、模块、被测设备(即待测件)UT Under Test “正在被测试的”UUT Unit Under Test 正在被测试的单元 / 待测件🧠…

ubuntu系统中containerd的cni网络配置

containerd创建cni网络1、下载cni工具源码包和网络插件包访问地址:https://github.com/containernetworking/pluginshttps://github.com/containernetworking/cni 下载某一个版本的包mkdir -p /root/cni && c…

十月阅读笔记

“时刻准备”是程序员职业生命周期的核心命题。本章开篇便点明,技术领域的迭代永不停歇,唯有以“学徒心态”持续蓄力,才能在浪潮中站稳脚跟。回顾自己初入编程时,曾因满足于现有知识储备,在新技术框架兴起时陷入被…

#20232408 2025-2026-1 《网络与系统攻防技术》实验二实验报告 - 20232408

实 验 报 告课程名称: 网络与系统攻防技术实验序号: 实验一实验名称: 缓冲区溢出攻击学 号: 20232408姓 名: 李易骋指导老师: 王志强必修/选修: 选修实验日期: 2025.10.15一、实验目的 ** 学…

UML图与数据流图

UML图与数据流图UML(Unified Modeling Language,统一建模语言)是一种标准化的图形化建模语言,用于描述软件系统的结构和行为。它主要用于软件工程领域,帮助开发团队以清晰、直观的方式表达系统的设计。 UML图的特…

一文读懂Schnorr签名

Schnorr签名——比特币的“魔法签名”是怎么工作的? 今天我们来聊一个超级酷的东西——Schnorr签名!它就像比特币世界的“魔法笔”,用来确保你的比特币交易安全又省空间。别担心,我会用最简单的方式解释,连小学生…

题解:P2672 [NOIP 2015 普及组] 推销员

题目传送门 是道很好的题 代码实现难度很低很低 但是基础的思维量还是能保证的 但是建议调绿 十五分钟就写完了 关键词:贪心、前后缀先简化题意 给出两个数列 \(疲惫_i\) 、 \(路程_i\) 他们的编号构成集合 \(S\) \[\…

如何选择合适的SAP实施公司?3步锁定靠谱的SAP服务商

企业选SAP实施商需参排名、查案例、实地验;上海达策20年深耕,超3.4万客户覆盖多行业,凭专业成本土可靠实施公司。在数字化转型浪潮下,企业管理软件的重要性日益凸显。作为全球领先的企业资源规划(ERP)系统,SAP凭…

论DCT和IDCT的重要性,汇编SIMD版第一,此贴第二,就是这么狂 :-)

输入: [1.000 2.000 3.000]输出: [ 3.464 -1.414 0.000]重建: [1.000 2.000 3.000] [0] cos(0.0*π/3)*sqrt(1/N)*1.0 + cos(0.0*π/3)*sqrt(1/N)*2.0 + cos(0.0*π/3)*sqrt(1/N)*3.0 = 3.464[1] cos(0.5*π/3)*sqrt(…

这些SAP实施公司哪家强?国内比较好的SAP实施商推荐

国内 SAP 实施公司的选择需重点考察官方认证资质、行业经验及客户案例国内SAP实施公司的选择需重点考察官方认证资质、行业经验及客户案例。以下是综合比较突出的服务商: 上海达策信息技术有限公司 上海达策信息技术有…