PyQt6 优化操作:建立侧边栏,要求可拖拽改变宽度,可用按钮控制侧边栏的展开和收起

1. 官方文档

QSplitter — PyQt Documentation v6.6.0

2. 效果展示

  • 可拖拽改变宽度比例

  • 点击按钮快速收起或展开侧边栏

点击按钮,侧边栏收起,同时按钮图标变为向左箭头 (对应展开功能),再次点击按钮,侧边栏展开,同时按钮图标改变为向右箭头 (对应收起功能)。

3. 代码细节说明

3.1. 控件拉伸布局:QSplitter 

3.1.1  Qt Designer中如何添加QSplitter

在 Qt Designer 的控件工具箱中没有 QSplitter 这个控件

添加 QSplitter 步骤

1、同时选中需要被添加到 QSplitter 分割器中的控件 (需要同时选中)

2、鼠标右键 --> 布局 --> 使用分裂器水平/垂直布局

也可以使用工具栏中的 <使用分裂器水平/垂直布局> 工具

3.1.2 QSplitter 常用方法

方法

描述

setSizes(Iterable[int])

将子部件各自的大小设置为列表中给出的值。对于水平分割器,则这些值表示每个部件的宽度(以像素为单位),从左到右;对于垂直分割器,表示每个部件的高度,从上到下。

widget(int) → QWidget

返回拆分器布局中给定索引处的部件。

setChildrenCollapsible(bool)

setCollapsible(int, bool)

默认情况下,子部件是可折叠的 (拖拽到边界部件将不显示,如同被折叠起来),这意味着用户可以将它们的大小调整为 0,即使它们具有非零的 minimumSize() 或 minimumSizeHint()。此行为可以修改:可通过函数 setChildrenCollapsible(bool) 将某个小部件改为不可折叠,也可通过函数 setchildrenCollapsible() 对拆分器中的所有小部件统一修改为不可折叠。

setHandleWidth(int)

分隔栏是 QSplitter 中用于分割子部件的一个可拖拽的条状控件,它位于两个子窗口之间。setHandleWidth 方法可以设置分隔栏的宽度。

setOpaqueResize(opaque: bool = True)

默认情况下,QSplitter 会动态调整其子元素的大小。如果希望 QSplitter 仅在调整大小的操作结束时才调整子元素的大小,请调用setOpaqueResize(False)。这个方法的主要作用是提高分割器拖动的性能,因为分割器不需要实时计算。

setOrientation(Orientation)

可使用 setOrientation(Orientation) 方法改变 QSplitter 的分割条的方向。如果参数为 Qt.Orientation.Horizontal,则分割条将水平分割窗口,左右两个区域可以分别调整大小;如果参数设置为 Qt.Orientation.Vertical,则分割条将垂直分割窗口,即上下两个区域可以分别调整大小。

(默认) self.splitter.setChildrenCollapsible(True) 效果:

尽可能的拖拽到最右侧,右边的部件将不显示。

self.splitter.setChildrenCollapsible(False) 效果:

即便拖拽到最右侧,右边的部件也能够显示一块内容。

self.splitter.setHandleWidth(20) 执行结果:

self.splitter.setOrientation(Qt.Orientation.Vertical) 执行结果:

3.2. 私有布局

私有布局(Private Layout)是一种基于 QWidget 的布局方式,可以在 QWidget 中添加子控件,并自动排列它们。与其他布局方式不同的是,私有布局是在 QWidget 的私有部分中实现的,因此只能在 QWidget 中使用,而不能在其他的控件中使用。 私有布局的优点是可以在 QWidget 中自由地布置和排列控件,而不必受到其他布局方式的限制。此外,私有布局还可以很好地处理控件之间的间距和边框等问题,能够实现更加灵活和精细的布局效果。私有布局的缺点是需要手动管理控件的位置和大小,需要编写更多的代码来实现复杂的布局效果。

3.3 按钮控件 CSS

对于按钮控件,可使用 border:none; 不显示按钮的边框,同时可以使用 QPushButton:pressed,设置 padding-top 和 padding-bottom 实现点击按钮时按钮小幅跳动的效果,从而使点击操作更明显。

4. 代码分享

版本:PyQt6   --   6.6.1

4.1 下载左右箭头图标 .png 文件 

可参考:

PyQt:辅助网站收集 (图标、颜色)_python pyqt 漂亮的按钮图标哪里下载-CSDN博客

文件放置于 ico_files 文件夹:

│  sidebar.py
│  sidebar_main.py
│      
└─ico_files
        arrow_left.png
        arrow_right.png

4.2 Ui 界面 <sidebar.py>

# Form implementation generated from reading ui file 'sidebar.ui'
#
# Created by: PyQt6 UI code generator 6.6.1
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt6 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(502, 317)
        self.centralwidget = QtWidgets.QWidget(parent=MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.splitter = QtWidgets.QSplitter(parent=self.centralwidget)
        self.splitter.setOrientation(QtCore.Qt.Orientation.Horizontal)
        self.splitter.setHandleWidth(0)
        self.splitter.setChildrenCollapsible(True)
        self.splitter.setObjectName("splitter")
        self.frame_2 = QtWidgets.QFrame(parent=self.splitter)
        self.frame_2.setStyleSheet("")
        self.frame_2.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
        self.frame_2.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
        self.frame_2.setObjectName("frame_2")
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.frame_2)
        self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_2.setSpacing(0)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.tabWidget = QtWidgets.QTabWidget(parent=self.frame_2)
        self.tabWidget.setStyleSheet("background-color: rgb(240, 240, 240);")
        self.tabWidget.setObjectName("tabWidget")
        self.tab = QtWidgets.QWidget()
        self.tab.setObjectName("tab")
        self.tabWidget.addTab(self.tab, "")
        self.tab_2 = QtWidgets.QWidget()
        self.tab_2.setObjectName("tab_2")
        self.tabWidget.addTab(self.tab_2, "")
        self.verticalLayout_2.addWidget(self.tabWidget)
        self.frame = QtWidgets.QFrame(parent=self.splitter)
        self.frame.setStyleSheet("background-color: rgb(255, 170, 0);")
        self.frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
        self.frame.setObjectName("frame")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.frame)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setSpacing(0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.groupBox = QtWidgets.QGroupBox(parent=self.frame)
        self.groupBox.setObjectName("groupBox")
        self.verticalLayout.addWidget(self.groupBox)
        self.horizontalLayout.addWidget(self.splitter)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(parent=MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 502, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(parent=MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        self.tabWidget.setCurrentIndex(0)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Tab 1"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Tab 2"))
        self.groupBox.setTitle(_translate("MainWindow", "GroupBox"))

4.3 主程序 <sidebar_main.py>

from PyQt6.QtCore import Qt
from PyQt6.QtGui import QIcon, QPixmap
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton, QHBoxLayout
import sys
import sidebar
import os


class Ui_overlap(sidebar.Ui_MainWindow, QMainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.splitter.setSizes([self.width() // 10 * 7, self.width() // 10 * 3])
        self.splitter.setHandleWidth(0)
        self.pushButton_expend = QPushButton(self.splitter.widget(0))
        self._prepare_ptn_expend()
        self.show()

    def _prepare_ptn_expend(self):
        # 设置大小、图标、功能
        self.pushButton_expend.resize(30, 30)
        self.pushButton_expend.setIcon(QIcon(QPixmap(
            os.path.abspath(os.path.join(os.path.dirname(__file__), 'ico_files', 'arrow_right.png')))))
        self.pushButton_expend.clicked.connect(self.adjust_sidebar)
        # 设置位置
        btne_hlayout = QHBoxLayout(self.tabWidget)
        btne_hlayout.addWidget(self.pushButton_expend, 0, Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignTop)
        btne_hlayout.setSpacing(0)
        btne_hlayout.setContentsMargins(0, 0, 0, 0)
        # 设置按钮样式
        self.splitter.widget(0).setStyleSheet(
            "QPushButton{\n"
            "    border-top-left-radius:3px;\n"
            "    border-bottom-left-radius:3px;\n"
            # "    background-color: rgb(170, 255, 255);\n"
            "}\n"
            "QPushButton:pressed{\n"
            "    padding-left:5px;\n"
            "    padding-top:5px;\n"
            "\n"
            "}")

    def adjust_sidebar(self):
        path1 = os.path.abspath(os.path.join(os.path.dirname(__file__), 'ico_files', 'arrow_right.png'))
        path2 = os.path.abspath(os.path.join(os.path.dirname(__file__), 'ico_files', 'arrow_left.png'))
        icon_to_right = QIcon(QPixmap(path1))
        icon_to_left = QIcon(QPixmap(path2))
        if self.frame.isHidden():
            self.frame.show()
            self.pushButton_expend.setIcon(icon_to_right)
        else:
            self.frame.hide()
            self.pushButton_expend.setIcon(icon_to_left)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    my_ui = Ui_overlap()
    sys.exit(app.exec())

参考链接

Qt中控件叠加悬浮显示的两种实现方法_qt 控件堆叠悬浮-CSDN博客

106.PyQt5_QSplitter_可拉伸区域分隔器控件_pyqt5 splitter-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Pycharm新建工程时使用Python自带解释器的方法

Pycharm新建工程时使用Python自带解释器的方法 新建Project时最好不要新建Python解释器&#xff0c;实践证明&#xff0c;自己新建的Python解释器容易出现各种意想不到的问题。 那么怎样使用Python安装时自带的解释器呢&#xff1f; 看下面的三张截图大家就清楚了。 我的Pyth…

英智数字孪生机器人解决方案,赋能仓库物流模式全面升级

工业机械臂、仓储机器人、物流机器人等模式的机器人系统在现代产业中扮演着愈发重要的角色&#xff0c;他们的发展推动了自动化和智能化水平的提高&#xff0c;有助于为制造业、物流业、医疗保健业和服务业等行业创造新效率并提升人们的生活质量。 行业面临的挑战 机器人开发、…

Windows安装Elasticsearch 7.9.2

1 下载 https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.9.2-windows-x86_64.zip 2 配置 进入config目录&#xff0c;打开elasticsearch.yml文件&#xff0c;给集群和节点配置名称。 cluster.name: my-es node.name: node-1 3 启动 打开bin目录&am…

Docker之常见FAQ记录清单

一、前言 本文记录Docker使用过程中遇见的问题&#xff0c;供后续回顾参考。 关联资源&#xff1a;网络Docker博客、官方FAQ、文档、Docker 从入门到实践、中文社区、riptutorial 二、问题及处理记录 2.1、docker容器内没有vi,nano等编辑器 1&#xff09;如果宿主机本地有&a…

vs2019 - warning LNK4098 : 默认库“msvcrt.lib”与其他库的使用冲突

文章目录 vs2019 - warning LNK4098 : 默认库“msvcrt.lib”与其他库的使用冲突概述笔记实验 - 编译静态库实验 - 编译主工程&#xff0c;包含静态库实验主工程和静态库编译设置不同时的编译报错和警告备注备注 - 判断/Mdd, /MdEND vs2019 - warning LNK4098 : 默认库“msvcrt.…

[SWPUCTF-2022-新生赛]ez_sql

title:[SWPUCTF 2022 新生赛]ez_sql 审题 根据提示&#xff0c;POST传参 得到假的flag 判断类型 字符型注入 判断列数 发现空格和’or’被过滤 重新构造 nss-1/**/oorrder/**/by/**/4#发现为3个字段 采用联合注入union 爆库 发现union被过滤&#xff0c;双写union绕过 发…

以生命健康为中心的物联网旅居养老运营平台

随着科技的飞速发展和人口老龄化的日益加剧&#xff0c;养老问题逐渐成为社会关注的焦点。传统的养老模式已经难以满足现代老年人的多元化需求&#xff0c;因此&#xff0c;构建一个以生命健康为中心的物联网旅居养老运营平台显得尤为重要。 以生命健康为中心的物联网旅居养老运…

两大成果发布!“大规模量子云算力集群”和高性能芯片展示中国科技潜力

在当前的科技领域&#xff0c;量子计算的进步正日益引起全球的关注。中国在这一领域的进展尤为显著&#xff0c;今天&#xff0c;北京量子信息科学研究院&#xff08;以下简称北京量子院&#xff09;和中国科学院量子信息与量子科技创新研究院&#xff08;以下简称量子创新院&a…

【c++】深入剖析与动手实践:C++中Stack与Queue的艺术

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 朋友们大家好&#xff0c;本篇文章我们来到STL新的内容&#xff0c;stack和queue 目录 1. stack的介绍与使用函数介绍例题一&#xff1a;最小栈例题二&#xff1a;栈的压入、弹出队列栈的模…

Docker 的数据管理 与 Docker 镜像的创建

目录 一、Docker 的数据管理 1.1.数据卷 1.2.数据卷容器 1.3.容器互联&#xff08;使用centos镜像&#xff09; 二、Docker 镜像的创建 2.1.基于现有镜像创建 2.2.基于本地模板创建 2.3.基于Dockerfile创建 2.3.1联合文件系统&#xff08;UnionFs&#xff09; 2.3.2…

GDPU 竞赛技能实践 天码行空9

1. 埃式筛法 求区间[2, n]内所有的素数对 &#x1f496; Main.java import java.util.Scanner;public class Main {static int N (int) 1e8, cnt 0;static int[] p new int[N];static boolean[] st new boolean[N];public static void main(String[] args){Scanner sc …

使用grasshopper修改梁的起始点方向

一般北方向朝上的情况&#xff0c;梁的方向从南向北&#xff0c;从西向东。 现在使用grasshopper来判断起始点坐标&#xff0c;分辨是否错误。 交换起始点这个&#xff0c;我实在不会用电池操作&#xff0c;只好敲python代码实现了。代码如下&#xff1a; 如果会敲代码的同学…

66.网络游戏逆向分析与漏洞攻防-利用数据包构建角色信息-重新规划游戏分析信息的输出

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…

Apache Seata的可观测实践

title: Seata的可观测实践 keywords: [Seata、分布式事务、数据一致性、微服务、可观测] description: 本文介绍Seata在可观测领域的探索和实践 author: 刘戎-Seata 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 Seata简介 Seata的…

STM32单片机通过ST-Link 烧录和调试

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 1. ST-LINK V2 ST LINK v2下载器用于STM32单片机&#xff0c;可以下载程序、调试程序、读取芯片数据&#xff0c;解除芯片读写保护等等&#xff0c;辅助软件用的是STM32 ST-LINK Utility。 STM32 ST-LINK Utility…

电脑上的任务管理器不见了?如何把它打开?

前言 今天小白在睡觉的时候突然梦见回到了学校的电脑教室…… 相信大家都会有体验&#xff1a;每次上电脑课的时候&#xff0c;老师都会通过某些软件监控和控制学生的电脑。 想退出被控端的软件&#xff1f;没机会&#xff01;毕竟任务管理器也被禁用了&#xff0c;想整活都…

算法学习之单调栈

发射站 题目描述 某地有 N N N 个能量发射站排成一行&#xff0c;每个发射站 i i i 都有不相同的高度 H i H_i Hi​&#xff0c;并能向两边&#xff08;两端的发射站只能向一边&#xff09;同时发射能量值为 V i V_i Vi​ 的能量&#xff0c;发出的能量只被两边最近的且比…

Opencv_14_多边形填充与绘制

绘制多边形&#xff1a; 1&#xff09;coInvert.polyline_drawing(src); 2&#xff09;void ColorInvert::polyline_drawing(Mat& image) { Mat canvas Mat::zeros(Size(512, 512), CV_8UC3); Point p1(100, 100); Point p2(150, 100); Point p3(200…

TR6 - Transformer实战 单词预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目录 理论知识关于数据集 Wikitext-2 模型结构代码实现0. 环境1. 加载数据集2. 模型搭建3. 创建模型4. 单轮训练和评估的流程5. 训练 模型效果总结与心得体会 …

Openharmony - 设备异常关机Power Down问题分析

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 1.问题描述1.1出现power down的原因1.1.1硬件故障或信号1.1.2软件错误或系统崩溃2.抓日志信息2.1.抓日志方法2.2.问题初步分析3.问题排…