python3 pyside6图形库学习笔记及实践(五)

前言

本系列文章为b站PySide6教程以及官方文档的学习笔记

原视频传送门:【已完结】PySide6百炼成真,带你系统性入门Qt

官方文档链接:Qt for Python

选项卡(QTabWidget)

创建选项卡

QTabWidget 提供了一个管理多个页面的堆栈,每个页面都有自己的选项卡标签。这使得用户可以通过选择不同的选项卡来切换不同的内容页面。

首先我们可以多创建几个QWidget实例,将其作为选项卡中的不同页面

self.tab1 = QWidget()
self.tab1Layout = QVBoxLayout()
self.tab1Layout.addWidget(QPushButton('Button1'))
self.tab1Layout.addWidget(QLabel('Label1'))
self.tab1.setLayout(self.tab1Layout)

self.tab2 = QWidget()
self.tab2Layout = QVBoxLayout()
self.tab2Layout.addWidget(QPushButton('Button2'))
self.tab2Layout.addWidget(QLabel('Label2'))
self.tab2.setLayout(self.tab2Layout)

self.tab3 = QWidget()
self.tab3Layout = QVBoxLayout()
self.tab3Layout.addWidget(QPushButton('Button3'))
self.tab3Layout.addWidget(QLabel('Label3'))
self.tab3.setLayout(self.tab3Layout)

接下来我们创建一个选项卡QTabWidget实例,并使用addTab方法向其中添加页面

self.tab = QTabWidget()
self.tab.addTab(self.tab1, 'Tab1')
self.tab.addTab(self.tab2, 'Tab2')
self.tab.addTab(self.tab3, 'Tab3')

效果如下

请添加图片描述

常用属性和方法

前面创建的选项卡离真实软件中的选项卡样式还有很大差距

以Vscode中的选项卡为例,它不仅有关闭按钮和上下文菜单,还可以进行拖动

这需要我们配置选项卡的高级属性和方法

请添加图片描述

我们可以使用setTabsClosable方法为选项卡增加关闭按钮

self.tab.setTabsClosable(True)

使用setMovable方法让选项卡能够被拖动

self.tab.setMovable(True)

此时选项卡就拥有关闭按钮且可拖动了,当然关闭功能还需绑定信号和槽

请添加图片描述

常用信号

tabCloseRequested信号会在我们点击关闭按钮时触发,并返回关闭的选项卡的信号

我们可以将其与removeTab方法绑定,实现关闭选项卡的功能

self.tab.tabCloseRequested.connect(lambda index: self.tab.removeTab(index))

剩下的三个信号也比较常用,后续在实践中也会用到

堆叠页面(QStackedWidget)

QStackedWidget 是一个容器控件,它可以包含多个子控件,但在任何给定时间只显示其中一个子控件。这对于实现向导界面或在同一位置显示不同内容的应用程序非常有用。

创建堆叠容器

QTabWidget 类似,我们可以通过创建多个 QWidget 实例作为不同的页面

self.stack1 = QWidget()
self.stack1Layout = QVBoxLayout()
self.stack1Layout.addWidget(QPushButton('Stack Button 1'))
self.stack1Layout.addWidget(QLabel('Stack Label 1'))
self.stack1.setLayout(self.stack1Layout)

self.stack2 = QWidget()
self.stack2Layout = QVBoxLayout()
self.stack2Layout.addWidget(QPushButton('Stack Button 2'))
self.stack2Layout.addWidget(QLabel('Stack Label 2'))
self.stack2.setLayout(self.stack2Layout)

self.stack3 = QWidget()
self.stack3Layout = QVBoxLayout()
self.stack3Layout.addWidget(QPushButton('Stack Button 3'))
self.stack3Layout.addWidget(QLabel('Stack Label 3'))
self.stack3.setLayout(self.stack3Layout)

使用addWidget方法将页面添加到堆叠容器中。初始情况下,QStackedWidget会显示第一个添加的页面

self.stackedWidget = QStackedWidget()
self.stackedWidget.addWidget(self.stack1)
self.stackedWidget.addWidget(self.stack2)
self.stackedWidget.addWidget(self.stack3)

效果如下

请添加图片描述

切换页面

可以使用 setCurrentIndexsetCurrentWidget 方法来切换 QStackedWidget 中当前显示的页面:

self.stackedWidget.setCurrentIndex(1)  # 切换到第二个页面
# 或者
self.stackedWidget.setCurrentWidget(self.stack3)  # 切换到第三个页面

setCurrentIndex传入页面的序号,而setCurrentWidget传入页面的实例名称

QStackedWidget 本身没有提供动画切换页面的功能。但是,我们可以通过结合使用 QPropertyAnimation来实现页面之间的平滑过渡动画。

过渡动画

我们新建一个堆叠页面的类,在其中重写setCurrentIndex函数,并加入动画效果

class AnimatedStackedWidget(QStackedWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.animation = QPropertyAnimation(self, b"geometry")
        self.animation.setDuration(300)  # 动画持续时间,单位为毫秒

    def setCurrentIndex(self, index):
        self.animation.stop()  # 停止当前动画
        current_widget = self.currentWidget()
        next_widget = self.widget(index)

        # 获取堆叠窗口的几何信息
        stacked_widget_geometry = self.geometry()
        
        # 新页面的起始位置在堆叠窗口的下方
        next_widget_start_geometry = QRect(stacked_widget_geometry.x(), stacked_widget_geometry.y() + stacked_widget_geometry.height()/4, stacked_widget_geometry.width(), stacked_widget_geometry.height())
        
        # 新页面的结束位置与当前页面相同
        next_widget_end_geometry = stacked_widget_geometry

        next_widget.setGeometry(next_widget_start_geometry)  # 设置新页面的起始位置

        self.animation.setTargetObject(next_widget)
        self.animation.setStartValue(next_widget_start_geometry)
        self.animation.setEndValue(next_widget_end_geometry)
        
        super().setCurrentIndex(index)  # 切换到新页面
        self.animation.start()

这里使用了QtCore中的动画类QPropertyAnimation,并设置为位置动画,即平移

切换到新页面时会从下往上平移加载

最后我们在页面中添加几个切换按钮

for i in range(3):
    btn = QPushButton(f"Go to page {i+1}")
    btn.clicked.connect(self.make_switcher(i))
    self.mainLayout.addWidget(btn)
    
def make_switcher(self, index):
    def switch():
        self.stackedWidget.setCurrentIndex(index)
    return switch

效果如下

请添加图片描述

当然我们也可以加一下判断条件,让动画更丝滑

比如当新的页面被切换时,动画还没播放完,则停止当前动画

课程亮点       本课程是PySide6零基础入门与项目实战视频教程,经过精心设计,分为十个章节,制作了141页ppt, 接近70个代码示例,主要讲解PySide6开发环境安装、基础控件与界面布局、项目实战,PySide6程序打包,安装包制作,安装卸载、更新,发布等知识。涵盖从基础概念到高级应用的全方位知识,旨在为你提供一条清晰、系统的学习之路。无论你是编程新手,还是希望深化对PySide6的了解,本课程都能满足你的需求。       教学环境:Win11 64bit、Python3.11、PyCharm、Anacoda。课程大纲第一章:基础篇 PySide6开发环境安装        从Anaconda环境配置开始,带你快速入门Win11/win10下PySide6、PyQt5开发环境的安装与配置,分别介绍PyCharm与VSCode如何配置PySide6,  以及Python AnaConda的基本用法,创建虚拟环境,安装python模块。第二章 控件与布局篇 PySide6常用控件与界面布局使用介绍        深入PySide6中的常用控件与界面布局技巧,通过丰富的实例,掌握PySide6的窗口、布局、控件等核心内容。主要介绍QLabel、QPushButton、QLineEdit、QCheckBox、QComboBox、QTextEdit、QTextBrowser、QListView与QListWidget、QStackedWidget、QTabWidget、QTableView等控件以及水平垂直布局,弹簧控件,栅格布局,表单布局。第三章 信号槽与事件机制       解锁PySide6的信号槽机制和事件处理技能,让你的应用更加灵活。详细介绍Qt自定义信号槽,跨窗口传递信号;Qt鼠标事件,键盘事件,组合事件,事件过滤。第四章 QMainWindow应用篇       详细介绍QMainWindow的使用,包括菜单栏、工具栏、状态栏和停靠窗口等。第章 样式表qss与自定义控件        教你如何使用样式表美化应用界面,并创建独特的自定义控件。掌握这些技能后,学员将能够设计出既美观又功能丰富的用户界面。第六章 图表与曲线        引入pyqtgraph,展示如何在PySide6应用中绘制图表和动态曲线。第七章 数据库编程        带你进入数据库编程世界,使用sqlite3与PySide6结合,进行数据存储和管理。第八章 项目实战:高仿有道词典        通过一个高仿有道词典的项目,将所学知识融会贯通,实战演练。课程中将会接入翻译接口,开发一个属于自己的翻译软件。第九章 打包与部署       教你如何将PySide6项目打包成exe,并使用Inno Setup制作安装包,介绍软件更新、卸载策略,让你的应用轻松上线。第十章 课程总结        回顾整个课程的学习内容,巩固知识点,为进一步的学习和应用打下坚实的基础。教学特色       实战案例:每个章节都配备实战案例,让学习者在实践中深化理解。       代码资料全覆盖:提供全套课程代码资料下载,便于学习者随时查阅和复习。       高效学习路径:课程内容结构清晰,由浅入深,适合不同层次的学习者。       本课程提供全部代码与在线答疑。谁应该学习这个课程       对图形界面开发感兴趣的编程新手。       希望提升个人技能,进入或者深耕在GUI开发领域的开发者。       需要快速掌握PySide6进行项目开发的软件工程师。结语        通过本课程的学习,你不仅能掌握PySide6的核心技能,还能通过实战项目提升解决实际问题的能力,最终让你能独立完成专业的GUI应用开发。随着技术的深入,你将发现PySide6不仅仅是一个工具库,它开启的是一扇通往高效、美观应用开发的大门。        开始PySide6的学习之旅,让你的编程之路更加精彩!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

handsomelky

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值