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

news2025/1/11 7:08:15

目录

  • 前言
  • 选项卡(QTabWidget)
    • 创建选项卡
    • 常用属性和方法
    • 常用信号
  • 堆叠页面(QStackedWidget)
    • 创建堆叠容器
    • 切换页面
    • 过渡动画

前言

本系列文章为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

效果如下

请添加图片描述

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

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

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

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

相关文章

Linux云计算 |【第二阶段】CLUSTER-DAY3

主要内容: Ceph概述、部署Ceph集群、Ceph块存储 一、分布式存储基础 分布式系统(Distributed File System)是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。文件系统管理的物理存储资源不一定直接连接在本…

ClickHouse:单机安装

目录 一、ClickHouse介绍 二、安装ClickHouse 2.1安装要求 2.2单机安装 2.3修改配置文件(可选) 2.4升级软件 三、使用ClickHouse 3.1连接ClickHouse 3.2 执行SQL 一、ClickHouse介绍 ClickHouse是由Yandex开源的一个高性能、面向列的SQL数据库管理系统(DBM…

【踩坑】pytorch中的索引与copy_结合不会复制数据及其解决方案

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 背景知识 实验验证 结论分析 错误案例 处理方法 注意事项 附加说明 基本索引返回视图 高级索引返回副本 赋值操作都是原地操作 以下内容…

SS9283403 sqlite3交叉编译并部署到SS928(六)

1.Sqlite3下载 连接:SQLite Download Page 2.解压 tar zxvf sqlite-autoconf-3460000.tar.gz 3.配置并编译 进入解压目录,打开命令行,输入如下命令 ./configure CCaarch64-mix210-linux-gcc --hostarm-linux --prefix/home/mc/work/sqlite…

002发那科ROBOGUIDE仿真导入模型

打开已经创建好的工程,找到“机器” 右键,添加机器->CAD文件(F) 找到本地的3D模型,然后点击,打开 设置模型位置[0,0,0,0,0,0] 然后就导入进来啦

对比速览 | Alluxio 企业版 v.s. 社区版

当前诸多企业面临着日益增长的数据量和复杂的数据管理挑战。特别是在模型训练的过程中,诸如GPU短缺、GPU利用率不高等问题已经成为许多企业在技术实施中面临的挑战。同时,大数据分析中跨云数据访问速度慢、成本高等问题也给企业带来了痛点。为了应对这些…

redolog和binlog的两阶段提交和区别

redolog和binlog区别 redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的…

Shell编程 --函数语法与重定向

文章目录 Shell编程shell函数语法函数参数 Shell 输入/输出重定向输出重定向输入重定向重定向深入讲解/dev/null 文件 总结 Shell编程 Shell是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令&…

Postman入门:环境变量和全局变量

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、发送请求 二、设置并引用环境变量 比如:我建的这个生产环境 使用环境有两个方式,一个是点击每个环境后面的对勾;另一种方式…

【Linux操作系统】进程的基本概念(PCB对象)详解

目录 一、进程的基本概念二、进程的描述组织(PCB对象)1.PCB的基本概念2.为什么要有PCB对象(操作系统对进程的组织管理)3.PCB对象的内部属性(tast_struct结构体) 三、查看进程1.ps指令2.top指令3.通过 /proc…

【LeetCode 1991 找到数组的中间位置 / LeetCode 724 寻找数组的中心下标】中间索引问题

1991 题目描述 暴力解法1: 思路: 遍历下标,求出左边和和右边和比较两边是否相等相等直接返回值没有符合的返回 -1 class Solution {public int findMiddleIndex(int[] nums) {int lennums.length;//初始化一个变量 midIndex 为 -1&#xff…

前端性能优化-script标签中的async与defer

前言 当浏览器解析 DOM 时候&#xff0c;遇到 script 标签时&#xff0c;会暂停 DOM 的解析&#xff0c;先加载并执行 script 中的代码&#xff0c;然后再继续 DOM 的解析。 比如 <script>window.env {version: "production",}; </script>上面的代码…

KVM——虚拟机添加设备与挂载磁盘

目录 一. 图形化方式添加设备 1. 添加磁盘 2. 添加网卡 二. 命令行形式添加设备 方式一&#xff1a; 方式二&#xff1a; 磁盘格式raw和qcow2 raw格式 qcow2格式 如何选择 挂载磁盘 一. 图形化方式添加设备 1. 添加磁盘 2. 添加网卡 先关机 给宿主机添加一块网…

华南理工大学-大学物理实验 迈克尔逊干涉仪

迈克尔逊干涉仪的调整与使用 引言 迈克尔逊( Albert Abrham Michelson, 1852-1931) , 著名的实验物理学家,近现代干涉仪的开山鼻祖。他设计了至今仍在广泛应用的迈克尔逊干涉仪。该仪器设计非常巧妙,测量极其精密,是近代许多干涉仪的基础。迈克尔逊当时设计该仪器的目的之…

HCIA复习 | HCIP基础

目录 Days01&#xff08;24.8.1&#xff09; IPv4 Header OSI七层模型 TCP、UDP数据结构 TCP/IP模型 OSI模型与TCP/IP模型区别 ARP Days02&#xff08;24.8.2&#xff09; 交换机 封装和解封装 IPv6 Header 路由 RIP Days01&#xff08;24.8.1&#xff09; IPv4 …

【面试题】【简历版】完整版

一、Java 基础 java 面向对象特性 封装&#xff08;Encapsulation&#xff09;&#xff1a; public class Student {// 将name和age封装起来private String name;private int age;// 提供方法设置和获取这些属性public void setName(String name){this.name name;}public Str…

JavaEE: 查看线程信息

示例用代码 public class Main {static class MyThread extends Thread {Overridepublic void run() {while (true) {System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}}public st…

基于Java+SpringBoot+Vue的网上超市的设计与实现

基于JavaSpringBootVue的网上超市的设计与实现 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f34…

canal监听mysql增量数据发布到rabbitmq

canal工作原理 canal 依靠mysql主从备份的原理&#xff0c;模拟 MySQL slave 的交互协议&#xff0c;伪装自己为 MySQL slave &#xff0c;向 MySQL master 发送dump 协议MySQL master 收到 dump 请求&#xff0c;开始推送 binary log 给 slave (即 canal )canal 解析 binary …

python模块01-pymysql数据库连接查询

PyMySQL 是用于连接 MySQL 服务器的一个库 1 安装&#xff1a; pip install pymysql 2 数据库连接 conn pymysql.connect(host"127.0.0.1",port3306,user"localhost",password"123456",charset"utf8",cursorclassDictCursor ) cur…