PySide6 UI 灵活性:QToolBar 的浮动与停靠及 QSplitter 的可调整面板

在现代桌面应用程序开发中,提供灵活且用户友好的界面至关重要。PySide6(Qt for Python)提供了强大的工具来构建这样的界面。本文将深入探讨两个关键的 PySide6 控件:QToolBarQSplitter,它们如何帮助开发者创建高度可定制和响应式的用户界面。

1. QToolBar:可浮动与停靠的工具栏

QToolBar 是 PySide6 中一个非常实用的控件,它允许开发者创建包含常用操作按钮、文本标签、下拉菜单等元素的工具栏。QToolBar 最强大的特性之一是其固有的浮动 (Floating)停靠 (Docking) 能力。

核心特性:

  • 停靠 (Docking)QToolBar 可以被用户拖动并“停靠”到 QMainWindow 的任何可用边缘,通常是顶部、底部、左侧或右侧。这使得用户可以根据自己的工作习惯和屏幕空间优化工具栏的位置。
  • 浮动 (Floating):当用户将 QToolBar 从其停靠位置拖离时,它会变成一个独立的、可自由移动的浮动窗口。这对于需要将工具栏放置在特定位置以便快速访问,同时又不希望它占用主窗口固定空间的场景非常有用。

实现方式:

QMainWindow 中添加 QToolBar 非常简单,只需创建 QToolBar 实例,然后使用 QMainWindowaddToolBar() 方法将其添加到主窗口即可。

from PySide6.QtWidgets import QMainWindow, QToolBar, QApplication, QLabel
from PySide6.QtGui import QAction
from PySide6.QtCore import Qt
import sys # 导入sys模块class MyMainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("QToolBar 示例")self.resize(800, 600) # 增加窗口大小# 设置一个中心部件,这是QMainWindow显示内容所必需的central_widget = QLabel("这是主窗口的中心内容")central_widget.setAlignment(Qt.AlignCenter) # 使文本居中self.setCentralWidget(central_widget)# 创建工具栏toolbar = QToolBar("我的工具栏")self.addToolBar(toolbar) # 将工具栏添加到主窗口# 添加一些动作到工具栏action1 = QAction("动作一", self)action2 = QAction("动作二", self)toolbar.addAction(action1)toolbar.addAction(action2)if __name__ == "__main__":app = QApplication(sys.argv) # 推荐使用sys.argvwindow = MyMainWindow()window.show()sys.exit(app.exec()) # 确保应用程序正确退出

通过上述代码,用户就可以在运行时拖动 toolbar,将其停靠到窗口的四个边缘,或者使其浮动。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

优势:

  • 用户定制性:用户可以根据个人喜好和工作流自由安排工具栏。
  • 空间优化:在小屏幕或需要最大化内容显示区域时,用户可以将不常用的工具栏浮动或隐藏。
  • 增强可用性:将常用功能集中在易于访问的位置,提高操作效率。

2. QSplitter:可调整大小的面板

QSplitter 是一个布局控件,它允许用户通过拖动分隔条来动态调整其内部子控件的大小。这对于创建具有可变区域的应用程序界面非常有用,例如文件浏览器(左侧目录树,右侧文件列表)或代码编辑器(左侧文件导航,右侧代码编辑区)。

核心特性:

  • 水平/垂直分割QSplitter 可以水平或垂直地分割其包含的区域。
  • 用户可调整大小:用户可以通过拖动分隔条来改变子控件的相对大小。
  • 初始大小设置:可以为每个子控件设置初始大小,确保应用程序启动时有一个合理的布局。

实现方式:

使用 QSplitter 的基本步骤是创建 QSplitter 实例,然后使用 addWidget() 方法将需要分割的控件添加到其中。

from PySide6.QtWidgets import QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QSplitter, QApplication
from PySide6.QtCore import Qtclass MyMainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("QSplitter 示例")self.setMinimumSize(600, 400)central_widget = QWidget()self.setCentralWidget(central_widget)main_layout = QHBoxLayout(central_widget)# 创建 QSplittersplitter = QSplitter(Qt.Horizontal) # 水平分割# 创建左侧面板left_panel = QWidget()left_layout = QVBoxLayout(left_panel)left_layout.addWidget(QLabel("这是左侧面板"))left_panel.setStyleSheet("background-color: lightblue;")# 创建右侧面板right_panel = QWidget()right_layout = QVBoxLayout(right_panel)right_layout.addWidget(QLabel("这是右侧面板"))right_panel.setStyleSheet("background-color: lightgreen;")# 将面板添加到 splittersplitter.addWidget(left_panel)splitter.addWidget(right_panel)# 设置初始大小比例(可选)# 例如,左侧200像素,右侧自动填充剩余空间splitter.setSizes([200, self.width() - 200]) main_layout.addWidget(splitter)if __name__ == "__main__":app = QApplication([])window = MyMainWindow()window.show()app.exec()

在上述代码中,left_panelright_panelsplitter 分割,用户可以通过拖动它们之间的分隔条来调整它们的宽度。
在这里插入图片描述
在这里插入图片描述

优势:

  • 灵活的布局:用户可以根据自己的需求调整不同区域的大小,以更好地查看内容。
  • 响应式设计:应用程序可以更好地适应不同屏幕尺寸和分辨率。
  • 提升用户体验:为用户提供更多的控制权,使界面更具交互性。

结论

QToolBarQSplitter 是 PySide6 中构建灵活和用户友好界面的强大基石。QToolBar 提供了可浮动和停靠的工具集,让用户能够自由组织常用功能;而 QSplitter 则允许用户动态调整界面中各个区域的大小,从而优化内容显示。通过巧妙地结合使用这些控件,开发者可以创建出既美观又高效的桌面应用程序,显著提升用户体验。

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

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

相关文章

B4016 树的直径

B4016 树的直径 - 洛谷 题目描述 给定一棵 n 个结点的树,树没有边权。请求出树的直径是多少,即树上最长的不重复经过一个点的路径长度是多少。 输入格式 第一行输入一个正整数 n,表示结点个数。 第二行开始,往下一共 n - 1 行…

【一维 前缀和+差分】

一、一维前缀和 1.1 定义 给定一个数组 a[1..n],其前缀和数组 pre[1..n] 定义为: pre[i]a[1]a[2]⋯a[i] pre[i] a[1] a[2] \dots a[i] pre[i]a[1]a[2]⋯a[i] 即 pre[i] 表示原数组从第 1 项到第 i 项的和。 1.2 构建 int a[N], pre[N]; for (int i …

Spring Boot 双数据源配置

文章目录什么是双数据源?为什么需要双数据源?核心实现原理完整示例注意什么是双数据源? 双数据源是指在一个应用程序中同时配置和使用两个不同的数据库连接。比如: 一个连接订单数据库,处理业务数据一个连接用户中心…

【Java】【力扣】102.二叉树层序遍历

思路一个辅助队列&#xff08;初始化队列&#xff1a;根节点入队&#xff09;一个节点 出队&#xff0c;他的左右孩子入队循环 直到队列为空举例代码public List<List<Integer>> levelOrder(TreeNode root) {if (rootnull){return new ArrayList<List<Intege…

为什么有些PDF无法复制文字?原理分析与解决方案

在日常办公和学习中&#xff0c;我们经常会从PDF文件中复制文字&#xff0c;用于编辑、引用、整理笔记。但你是否也遇到过这样的情况&#xff1a;有些PDF中的文字根本无法选中&#xff0c;更无法复制粘贴&#xff1f; 看起来像是“文字”&#xff0c;但操作上却完全无效——这…

LabVIEW浏览器ActiveX事件交互

​程序围绕 WebBrowser ActiveX 控件&#xff0c;借 “Reg Event Callback” 注册标题变更回调&#xff0c;“Callback - Title Change.vi” 处理标题数据&#xff0c;“Monitor...” 响应 URL 变更&#xff0c;“Unregister...” 清理资源&#xff0c;实现浏览器事件交互与管控…

C++后端面试八股文

一、C 语言基础与底层原理请解释 new / delete 和 malloc / free 的区别和联系&#xff0c;以及使用它们时需要注意什么new 和 delete 是C的​​运算符&#xff08;Operator&#xff09;​​。这意味着它们可以被类&#xff08;通过 operator new 和 operator delete&#xff0…

基础分类模型及回归简介(一)

一、先搞懂两个核心任务&#xff1a;分类和回归咱们生活中总遇到要 “判断” 或 “预测” 的事&#xff1a;比如看到一个水果&#xff0c;判断是苹果还是橘子 —— 这就是分类&#xff08;结果是 “类别”&#xff09;&#xff1b;比如根据西瓜的大小、颜色&#xff0c;猜它能卖…

【LeetCode 热题 100】114. 二叉树展开为链表——(解法二)分治

Problem: 114. 二叉树展开为链表 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。 展开后的单链表应该与二叉树 先序…

【WPF】WPF 自定义控件 实战详解,含命令实现

&#x1f9e9;《WPF 自定义控件》实战详解本文将围绕如何编写一个自定义控件&#xff08;如带右键菜单的图片控件 ImageView&#xff09;&#xff0c;逐步讲解其定义、命令绑定与 ContextMenu 中常见的语法技巧。&#x1f9f1; 一、创建一个 WPF 自定义控件的步骤 WPF 中自定义…

Flink 2.0 DataStream算子全景

在实时流处理中&#xff0c;Apache Flink的DataStream API算子是构建流处理 pipeline 的基础单元。本文基于Flink 2.0&#xff0c;聚焦算子的核心概念、分类及高级特性。 一、算子核心概念&#xff1a;流处理的"原子操作 1. 数据流拓扑&#xff08;Stream Topology&#x…

Flask 入门到实战(2):使用 SQLAlchemy 打造可持久化的数据层

Flask 入门到实战&#xff1a;使用 SQLAlchemy 打造可持久化的数据层一、前言&#xff1a;为什么用 Flask-SQLAlchemy&#xff1f; 在 Python Web 开发中&#xff0c;操作数据库的方式主要有两种&#xff1a; 直接写 SQL&#xff08;繁琐且难维护&#xff09;使用 ORM&#xff…

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | GithubProfies(GitHub 个人资料)

&#x1f4c5; 我们继续 50 个小项目挑战&#xff01;—— GithubProfies组件 仓库地址&#xff1a;https://github.com/SunACong/50-vue-projects 项目预览地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 Composition API&#xff08;<script setup…

simscape中坐标系和坐标变换Frames and Transforms

为了更便捷地描述单个物体的运动&#xff0c;最好以该物体的质心为坐标原点建立坐标系&#xff0c;从而可以非常方便地描述其旋转运动。因此&#xff0c;在计算多个物体之间的位置关系时&#xff0c;为了计算方便&#xff0c;需要频繁地更换坐标框架&#xff0c;这也是multibod…

构建分布式光伏“四可”能力:支撑新型电力系统安全稳定运行的关键路径

随着我国新能源装机规模的跨越式增长&#xff0c;国家能源战略对新能源电站的规范化接入与精细化调度管理提出了更高要求。在电力市场化改革深化与新型电力系统构建的关键时期&#xff0c;保障电网安全稳定、提升新能源高效消纳能力已成为核心议题。国家能源局于2025年1月17日正…

UART寄存器介绍

在 STM32 微控制器中&#xff0c;UART&#xff08;通用异步收发传输器&#xff09;通信通过多个寄存器实现配置和数据传输。下面详细解析 UART 的核心寄存器及其功能。1. 状态寄存器&#xff08;USART_SR&#xff09;状态寄存器反映 UART 当前的工作状态&#xff0c;用于判断数…

写一个算法对一组值进行归一化映射,使它们在视觉上有明显的区分度,尤其在数据集分布不均时仍能体现差异

问题&#xff1a; 有一批数据&#xff0c;都是随机值范围是不确定&#xff0c;我需要用这个值来绘制同样数量圆&#xff0c;不同值他们的圆半径不同&#xff0c;考虑到数据有时候大小偏差不大&#xff0c;这1000个值有可能是集中在10,20之间&#xff0c;也可能是分布广泛&#…

具身智能零碎知识点(五):VAE中对使用KL散度的理解

VAE中对使用KL散度的理解什么是 VAE (Variational AutoEncoder)&#xff1f;从自编码器 (AE) 说起VAE&#xff1a;让潜在空间变得“有意义”和“连续”KL 散度是如何用到的&#xff1f;通俗理解 KL 散度在 VAE 中的作用&#xff1a;带来的好处&#xff1a;KL 散度公式 (无需背诵…

理解:进程、线程、协程

线程、进程和协程是并发编程的重要组成部分。进程&#xff08;Process&#xff09;定义进程是操作系统分配资源的基本单位&#xff0c;表示一个正在执行的程序。一旦一个程序被加载到内存中&#xff0c;它就成为一个进程&#xff0c;而每个进程都有其独立的内存空间。特征进程之…

总结一下找素数的三种方法

目录 一试除法 二埃氏筛 三线性筛(欧拉筛) 一试除法 思想&#xff1a;就是判断某个数x是不是素数,就判断从2开始到小于根号x的范围内有没有能够取余不等于0的,这个说明当前值就是x的一个因子&#xff0c;所以不是素数。 代码&#xff1a; import java.util.Scanner;public…