PyQt5利用Qt designer(QT设计师)使用tab widget和stacked widget实现多页面切换

news2024/12/30 3:15:53

PyQt5 Qt designer QT设计师 使用tab widget和stacked widget实现多页面切换

  • 一、使用Qt designer(QT设计师)进行多页面切换ui设计
  • 二、实现tab widget多页面切换
  • 三、实现stacked widget多页面切换
  • 四、生成代码
  • 五、运行效果

一、使用Qt designer(QT设计师)进行多页面切换ui设计

本文只提供一种设计思路来完成简单的页面切换功能,并没有涉及页面的美化以及复杂的业务功能实现。

点击tab页对tab widget的tab页进行切换效果图:
20221220004200

点击radio button驱动stacked widget多页面切换效果图:
20221220004326

下面进行分步说明。

打开qt designer,新建一个widget窗口。
20221219235035

将一个tab widget拖入其中

20221219235147

在窗口内空白部分点击右键,选择布局中的垂直布局
20221219235252

20221219235322

tab widget默认只有2个tab,如果需要更多的话,可以按照需求自行插入新的tab页。比如这里想在tab2后面再插一个tab3,那么选中tab2,然后右键点击,选择在当前页之后插入
20221219235515

tab页的标题根据自己的需求进行调整
20221219235551

下面我们主要对tab1进行主要的设计,以此说明原理

在tab1上拖入一个Scroll Area,准备在里面放3个部分内容。以便拖动展示。
20221219235805

设置Scroll Area的大小
20221219235844

在Scroll Area内,放入3个Frame,表示3个模块
20221219235931

点击Scroll Area, 对其进行垂直布局,这样3个Frame就可以变整齐了
20221220000053

将3个Frame的拉伸比例设置为1:1:1
20221220000313

依次点击每个Frame,右键单击,选择改变样式表,为其添加背景色,这样3个Frame就可以很容易肉眼区分了
20221220000457

20221220000509

效果如下:
20221220000525

然后我们针对第一个Frame进行设计,其他两个Frame,以此类推,这样就可以通过每个Frame展示不同的内容。

在Frame1中拖入一个Stacked Widget, 用于展示3个不同的页面
20221220000700

再拖入一个Widget, 用于放置3个按钮
20221220000805

选中Frame1,对其进行垂直布局
20221220000843

将widget的高度设为30
20221220000934

然后拖动3个radio button到这个widget里,并将它们的最大高度和宽度都设为16
20221220001220

右键单击widget,对其进行水平布局
20221220001257

然后再在widget内这3个按钮的两侧分别放置两个水平弹簧, 就可以将3个radio button压缩到正中间
20221220001427

因为我们有3个radio button,stacked widget默认提供2个页面,我们再加一个,方法同上面tab widget加页面是一样的, 这三个radio button分别对应stacked widget中的3个页面
20221220001545

我们给stacked widget中的三个page页面分别添加一张图片,以示区分。添加完成后,此时,点击右上角那两个前后箭头,应该可以看到页面能正常切换
20221220001752

这里关于怎么添加资源文件,就不赘述了。我们这里是新建了一个资源文件,名字叫resource, 对应的文件就是下文提到的resource.qrc
20221220004028在为Frame添加了图片之后,原来的背景色就被我删掉了。所以后面运行时看不到之前添加的背景色了。

多页面切换的ui设计示例就到此结束了。目前还缺少页面切换功能的实现。

二、实现tab widget多页面切换

它的实现比较简单,在ui页面,添加对应的信号和槽函数即可。
信号是currentChanged(int), 槽函数是setCurrentIndex(int)

20221220002244

三、实现stacked widget多页面切换

stacked widget的多页面切换,我们是通过3个radio button来驱动的,点中哪个radio button,就切换到stacked widget的对应某个页面。

为此,我们也需要设置stacked widget的信号和槽,和上面tab widget一样。信号是currentChanged(int), 槽函数是setCurrentIndex(int)

20221220002543

但是怎么和radio button关联呢,为此我们还需要手动负责currentChanged(int)信号的发射。这将在代码中体现。

四、生成代码

首先,将资源文件resource.qrc和ui文件my_tab_widget.ui转换为py格式。

# 将qrc资源文件编译为二进制文件
pyrcc5 -o resource_rc.py resource.qrc

# 将ui文件生成为相关的类
pyuic5 -o my_tab_widget.py my_tab_widget.ui

这里我们生成了resource_rc.py和my_tab_widget.py

20221220002815

需要注意的是,由于我们的资源文件名为resource.qrc,在执行以下转换命令之后

pyuic5 -o my_tab_widget.py my_tab_widget.ui

生成的my_tab_widget.py最后,会自动生成一句:

import resource_rc

所以我们在转换资源文件resource.qrc时,需要将其名称指定为resource_rc.py, 否则在程序运行时,会报错,提示找不到resource_rc模块。

这些工作做完后,我们新建一个main.py, 内容如下:
main.py

from PyQt5.QtWidgets import QApplication, QWidget
import sys
from my_tab_widget import Ui_Form

class MyUI(QWidget, Ui_Form):
    def __init__(self):
        super().__init__()
        super().setupUi(self)

        # 这里我们将radio button的clicked信号,绑定到自定义的槽函数上
        self.radioButton.clicked.connect(self.radioButton_click_handler)
        self.radioButton_2.clicked.connect(self.radioButton_2_click_handler)
        self.radioButton_3.clicked.connect(self.radioButton_3_click_handler)
        
    # 自定义的槽函数,用于发射stackedWidget的currentChanged信号,来驱动页面的切换
    def radioButton_click_handler(self):
        self.stackedWidget.currentChanged.emit(0)
        
    def radioButton_2_click_handler(self):
        self.stackedWidget.currentChanged.emit(1)
        
    def radioButton_3_click_handler(self):
        self.stackedWidget.currentChanged.emit(2)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    
    my_widget = MyUI()
    my_widget.show()
    
    sys.exit(app.exec_())

在main.py里,我们自定义了一个MyUI类,继承自我们设计的ui界面,并在其中将radio button的clicked信号绑定到自定义的槽函数上,用于发射stackedWidget的currentChanged信号,以此驱动stackedWidget的页面切换。

五、运行效果

点击tab页对tab widget的tab页进行切换:
20221220004200

点击radio button驱动stacked widget多页面切换:
20221220004326

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

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

相关文章

Go 实现线性查找算法和二分查找算法

耐心和持久胜过激烈和狂热。 哈喽大家好,我是陈明勇,今天分享的内容使用 Go 实现线性查找算法和二分查找算法。如果本文对你有帮助,不妨点个赞,如果你是 Go 语言初学者,不妨点个关注,一起成长一起进步&…

雪花算法原理

SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图:1bit,不用,因为二进制中最高位是符号位,1表示负数,0表示正数。生成的id一般都是用整数,所以最高位固定为0。41bit时间戳&#…

热门技术中的应用:云计算中的网络-第27讲-云中的网络QoS:邻居疯狂下电影,我该怎么办?

在小区里面,是不是经常有住户不自觉就霸占公共通道,如果你找他理论,他的话就像一个相声《楼道曲》说的一样:“公用公用,你用我用,大家都用,我为什么不能用?”。 除此之外,你租房子的时候,有没有碰到这样的情况:本来合租共享WiFi,一个人狂下小电影,从而你网都上不…

编程15年40岁程序员的我终于在压力下被迫转行了

本人今年40岁多了,中山大学计算机小硕,已经从事it工作15年多,最后一次工作是2017年,创业,互联网教育方向,2020年失败关闭公司。 创业失败后,在家沉淀了几个月,然后决定再次找工作。…

如何在UnrealEngine虚幻引擎中进行版本管理

项目团队中的分工协作必不可少,在UE项目中进行版本控制非常必要。UE支持使用Perforce和SVN进行版本管理,此处选用自己比较熟悉的SVN。 1.使用SVN进行源码管理 通过编辑器偏好设置窗口(编辑(Edit)> 编辑器偏好设置&…

9. Spring注解开发

1. 注解开发定义Bean对象 目的&#xff1a;xml配置Bean对象有些繁琐&#xff0c;使用注解简化Bean对象的定义 1.1 在applicationContext.xml中开启Spring注解包扫描 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.spr…

33 CPP类多态-如何析构派生类

33 CPP类多态-如何析构派生类 派生类的析构函数在执行完后&#xff0c;会自动执行基类的析构函数&#xff0c;这是C编译器强制的规定。 这时候基类的内存模型&#xff1a;AA表示的就是Person类 将基类的析构函数设置为虚函数后。 基类的虚函数表中多了一个函数&#xff0c;但是…

性能测试(二)—— 常用测试工具、JMeter环境搭建、JMeter功能概述

目录 一、常用性能测试工具 1. 主流性能测试工具 1.1 LoadRunner 1.2 JMeter 1.3 LoadRunner 与 JMeter对比 二、JMeter环境搭建 1. 安装JDK 1.1 JDK下载 1.2 JDK配置环境变量 2. 安装JMeter 2.1 下载 2.2 安装 2.3 Jmeter环境配置 2.4 启动验证 三、JMeter功能…

[附源码]计算机毕业设计Python的中点游戏分享网站(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

反应式编程框架设计:如何使得程序调用不阻塞等待

前言&#xff1a; 程序在高并发的情况下&#xff0c;程序容易崩溃。主要的原因是&#xff1a;在高并发的情况下&#xff0c;有大量用户请求需要程序计算处理&#xff0c;而目前的处理方式是&#xff0c;为每个用户请求分配一个线程&#xff0c;当程序内部因为访问数据库等原因…

软件测试:Java VS Python,刚开始应该选择哪门语言进行入门呢?

前言 当你学完软件测试基本理论&#xff0c;掌握业务测试流程&#xff0c;功能测试可以搞定&#xff0c;数据库和linux玩得也很溜时&#xff0c;接下来想进一步进阶&#xff0c;那么学习一门编程语言必不可少。 同时&#xff0c;学习一门编程语言也是你成为自动化测试工程师乃…

如何正确使用JMeter性能测试?紧扣面试实际要求

前段时间专门挑了一段时间在准备面试。经过两次面试后&#xff0c;有一些比较深刻的认识。对于企业要求来说&#xff0c;除了对专业理论知识考究之外&#xff0c;对测试工具这块也是看重的。 一、使用JMeter测试快速入门 1、线程组是什么 进程&#xff1a; 一个正在执行的程序…

图解设计模式: 有趣的工厂模式

工厂模式 Factory Method 在工厂模式中 父子类的关系就像是生产工厂中模具一样, 由父类负责指定实例生成的方式 子类来决定生成具体的类. 具体的处理全部交给子类负责&#xff0c;目的就是为了将生产实例的框架和负责实例生产类解耦 示例程序 从下面这段示例来看看工厂模式到…

Codeforces Round #839 (Div. 3)

A. AB? 题意&#xff1a; t组测试每组给出以ab的形式给出算式&#xff0c;求ab的值。&#xff08;a,b都是0~9&#xff09; 代码&#xff1a; tint(input()) for i in range(t):sinput()print(eval(s)) B. Matrix Rotation 题意&#xff1a; t组测试每组给一个2*2的矩阵&…

NoSQL数据库原理与应用综合项目——Redis篇

NoSQL数据库原理与应用综合项目——Redis篇 文章目录NoSQL数据库原理与应用综合项目——Redis篇0、 写在前面1、本地数据或HDFS数据导入到Redis2、Redis数据库表操作2.1 Java API 连接Redis2.2 查询数据2.3 插入数据2.4 修改数据2.5 删除数据3、Windows远程连接Redis(Linux)4、…

谁说女生不可以学编程?维密超模放弃年薪千万,一心只当程序媛

说到IT行业&#xff0c;大家第一反应应该是程序员 谁说女生不可以学编程&#xff1f;维密超模放弃年薪千万&#xff0c;一心只当程序媛 感觉一说起IT工作者 大家都会想到一个男性的形象 但是其实 有一批脸美、胸大、腰细、腿长、还都热爱编程的妹纸正在加入你们的行列&#…

(附源码)Springboot宠物领养系统 毕业设计 241104

Springboot宠物领养系统 摘 要 如今&#xff0c;随着人们生活水平不断提高&#xff0c;人们的生活在物质满足的基础上&#xff0c;更多的人将生活的重点放在追求精神享受的过程中。于此同时&#xff0c;Internet铺天盖地的普及&#xff0c;使得这样的人纷纷通过Internet的方式去…

springboot 3.0 工程建立

springboot 3.0 工程建立 脚手架搭建 进入spring官网提供的https://start.spring.io/进行脚手架搭建。 选择 Maven进行包管理&#xff0c;语言选择JAVA&#xff0c;Spring Boot 版本选择3.0.0&#xff0c;JDK 版本选择17。并在右侧选择自己希望的依赖。结果如下图&#xff1…

基于SpringMVC+Hibernate+Layui城市智能消防决策平台设计

开发软件&#xff1a;Eclipse,可以用idea,mysql数据库 开发技术&#xff1a;SpringMVC,Spring,Hibernate,jquery,layui 本系统的功能主要分为两个角色&#xff0c;其中用户的功能有&#xff1a;登陆注册&#xff0c;查看火灾案例&#xff0c;火警报警&#xff0c;查看自己的报警…

【产品经理必备文档】述职报告/年终总结汇报ppt模板

今天和大家免费分享产品必备文档模板——产品经理述职文档&#xff08;年终总结汇报&#xff09;的ppt模板~~~ 【文档下载】 这个ppt模板可以在下方小程序里免费下载哦 【编写教程】 个人工作年终总结一般分成4部门&#xff1a;个人岗位职责、工作完成情况、年度经验总结、 1…