基于PyQt5的UI界面开发——多界面切换

news2024/12/28 2:07:44

介绍

最初,因为课设的缘故,我只是想做一个通过按键进行切面切换而已,但是我看网上资料里面仅是语焉不详,让我困惑的很,但后面我通过摸索才发现这件事实在是太简单了,因此我想要记录下来。

本博客将介绍如何使用PyQt5库创建一个具有多界面切换功能的应用程序。通过详细的代码示例,我们将展示如何设计一个包含两个主要界面的应用,用户可以通过菜单栏的选项在这两个界面之间自由切换。代码示例中,我们使用了QStackedWidget来实现界面的切换。此外,我们还将分享如何连接菜单项与界面切换功能的技巧。无论是初学者还是有一定经验的开发者,都能通过本博客快速掌握PyQt5中多界面切换的实现方法,为自己的应用程序增添更多交互性和灵活性。

UI的设计

创建不需要选择其他,就只用选择主窗口,即下面图所示

在左边的控件中的Containers中选择Stacked Widget。拉到主窗口中,拉托到合适的大小。

由于目前的不是很明显,所以你可以暂时先修改一下它的属性。将frameShape修改为Box。

 现在就明显许多了,接下来我们随便的添加一些控件。

预览效果如下所示:

界面1

 界面2

可以通过右上角的两个三角形进行切换,没关系,只是这里的预览有,通过代码就没有了。接下来我准备使用菜单栏来进行示例,如下所示:

这里我们将菜单栏部分的“界面1”命名为action_1,“界面2”命名为action_2。

菜单栏控制界面切换

下面为我设计的简单ui转换的代码,Switch.py。

# -*- coding: utf-8 -*-

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


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(798, 553)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.stackedWidget = QtWidgets.QStackedWidget(self.centralwidget)
        self.stackedWidget.setGeometry(QtCore.QRect(50, 70, 721, 401))
        self.stackedWidget.setFrameShape(QtWidgets.QFrame.Box)
        self.stackedWidget.setObjectName("stackedWidget")
        self.page = QtWidgets.QWidget()
        self.page.setObjectName("page")
        self.checkBox1 = QtWidgets.QCheckBox(self.page)
        self.checkBox1.setGeometry(QtCore.QRect(430, 150, 75, 16))
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.checkBox1.setFont(font)
        self.checkBox1.setObjectName("checkBox1")
        self.pushButton1 = QtWidgets.QPushButton(self.page)
        self.pushButton1.setGeometry(QtCore.QRect(260, 150, 93, 28))
        self.pushButton1.setObjectName("pushButton1")
        self.stackedWidget.addWidget(self.page)
        self.page_2 = QtWidgets.QWidget()
        self.page_2.setObjectName("page_2")
        self.pushButton2 = QtWidgets.QPushButton(self.page_2)
        self.pushButton2.setGeometry(QtCore.QRect(300, 140, 93, 28))
        self.pushButton2.setObjectName("pushButton2")
        self.checkBox2 = QtWidgets.QCheckBox(self.page_2)
        self.checkBox2.setGeometry(QtCore.QRect(320, 230, 75, 16))
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.checkBox2.setFont(font)
        self.checkBox2.setObjectName("checkBox2")
        self.stackedWidget.addWidget(self.page_2)
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(330, 10, 141, 41))
        font = QtGui.QFont()
        font.setFamily("宋体")
        font.setPointSize(12)
        self.label.setFont(font)
        self.label.setObjectName("label")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 798, 26))
        self.menubar.setObjectName("menubar")
        self.menu = QtWidgets.QMenu(self.menubar)
        self.menu.setObjectName("menu")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.action_1 = QtWidgets.QAction(MainWindow)
        self.action_1.setObjectName("action_1")
        self.action_2 = QtWidgets.QAction(MainWindow)
        self.action_2.setObjectName("action_2")
        self.menu.addAction(self.action_1)
        self.menu.addAction(self.action_2)
        self.menubar.addAction(self.menu.menuAction())

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

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.checkBox1.setText(_translate("MainWindow", "test1"))
        self.pushButton1.setText(_translate("MainWindow", "界面1"))
        self.pushButton2.setText(_translate("MainWindow", "界面2"))
        self.checkBox2.setText(_translate("MainWindow", "test2"))
        self.label.setText(_translate("MainWindow", "多界面切换测试"))
        self.menu.setTitle(_translate("MainWindow", "选择"))
        self.action_1.setText(_translate("MainWindow", "界面1"))
        self.action_2.setText(_translate("MainWindow", "界面2"))

下面是实现通过菜单栏进行切换的核心代码,此处仅作一个示例。 

from PyQt5 import QtWidgets

from Switch import Ui_MainWindow

class SwichWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        self.action_1.triggered.connect(self.showinterface_1)
        self.action_2.triggered.connect(self.showinterface_2)

    def showinterface_1(self):
        self.stackedWidget.setCurrentIndex(0)

    def showinterface_2(self):
        self.stackedWidget.setCurrentIndex(1)

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = SwichWindow()
    window.show()
    sys.exit(app.exec_())

其实,这里应该是可以直接通过槽信号连接的,但我实在是有段时间没有接触了,况且使用代码也比较容易。 

演示效果

如果觉得这个框有点碍眼,可以将其调回无框的状态。 

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

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

相关文章

Virtualbox硬盘扩容

前言 有没有使用虚拟机安装操作系统的时候,虚拟硬盘一开始分配的虚拟硬盘空间不够用?在后期去扩容的伙伴们,下面我看看如何扩容virtualbox的虚拟硬盘? 重新分配虚拟硬盘大小 在virtualbox菜单选择【管理】-【工具】-【虚拟介质…

如何实现 MySQL 的读写分离?

面试题 你们有没有做 MySQL 读写分离?如何实现 MySQL 的读写分离?MySQL 主从复制原理的是啥?如何解决 MySQL 主从同步的延时问题? 面试官心理分析 高并发这个阶段,肯定是需要做读写分离的,啥意思&#x…

路由器的原理

✍作者:柒烨带你飞 💪格言:生活的情况越艰难,我越感到自己更坚强;我这个人走得很慢,但我从不后退。 📜系列专栏:网路安全入门系列 目录 路由器的原理一,路由器基础及相关…

学习C++:标识符命名规则

标识符命名规则: 作用:C规定给标识符(变量、常量)命名时,有一套自己的规则 标识符不能是关键字 标识符只能由字母、数字、下划线组成 第一个字符必须为字母或下划线 标识符中字母区分大小写 (给标识符命…

Git如何设置和修改当前分支跟踪的上游分支

目录 前言 背景 设置当前分支跟踪的上游分支 当前分支已有关联,删除其关联,重新设置上游 常用的分支操作 参考资料 前言 仅做学习记录,侵删 背景 在项目开发过程中,从master新建分支时,会出现没有追踪的上游分…

【数据科学导论】第一二章·大数据与数据表示与存储

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀数据处理与分析_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言…

LeetCode - Google 校招100题 第8天 图(Graph) (2题)

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/144744820 LeetCode 合计最常见的 112 题: 校招100题 第1天 链表(List) (19题)校招100题 第2天 树(Tree) (21题)校招100题 第3天 动态规划(DP) (20题)

五分钟学会如何在GitHub上自动化部署个人博客(hugo框架 + stack主题)

上一篇文章: 10分钟学会免费搭建个人博客(Hugo框架 stack主题) 前言 首先,想要实现这个功能的小伙伴需要完成几个前置条件: 有一个GitHub账号安装了git,并可以通过git推送commit到GitHub上完成第一篇文章…

kubernetes Gateway API-部署和基础配置

文章目录 1 部署2 最简单的 Gateway3 基于主机名和请求头4 重定向 Redirects4.1 HTTP-to-HTTPS 重定向4.2 路径重定向4.2.1 ReplaceFullPath 替换完整路径4.2.2 ReplacePrefixMatch 替换路径前缀5 重写 Rewrites5.1 重写 主机名5.2 重写 路径5.2.1 重新完整路径5.2.1 重新部分路…

操作002:HelloWorld

文章目录 操作002:HelloWorld一、目标二、具体操作1、创建Java工程①消息发送端(生产者)②消息接收端(消费者)③添加依赖 2、发送消息①Java代码②查看效果 3、接收消息①Java代码②控制台打印③查看后台管理界面 操作…

使 el-input 内部的内容紧贴左边

<el-inputv-model"form.invitor"placeholder"PC端的自动取当前账号的手机号"readonlyclass"no-border-input" />::v-deep(.no-border-input .el-input__inner) { border: none; box-shadow: none; padding-left: 0; /* 确保内容紧贴左边 *…

服务器分区与挂载(新手友好)

本文为实习期间项目实施心得分享在此供各位实习生使用 安装Centos7.9 1>这里选择上面的安装Centos7 2>回车后,等待到这个画面.选择你的语言 3>时区和语言自己按需选择 4>我们本次采取最小化安装只需要改这两个地方 1>选择INSTALLATION DESTINATION 这一步进行…

Docker-构建自己的Web-Linux系统-镜像webtop:ubuntu-kde

介绍 安装自己的linux-server,可以作为学习使用&#xff0c;web方式访问&#xff0c;基于ubuntu构建开源项目 https://github.com/linuxserver/docker-webtop安装 docker run -d -p 1336:3000 -e PASSWORD123456 --name webtop lscr.io/linuxserver/webtop:ubuntu-kde登录 …

spring专题笔记(六):bean的自动装配(自动化注入)-根据名字进行自动装配、根据类型进行自动装配。代码演示,通俗易懂。

目录 一、根据名字进行自动装配--byName 二、根据类型进行自动装配 byType 本文章主要是介绍spring的自动装配机制&#xff0c; 用代码演示spring如何根据名字进行自动装配、如何根据类型进行自动装配。代码演示&#xff0c;通俗易懂。 一、根据名字进行自动装配--byName Us…

深入探讨 Go 中的高级表单验证与翻译:Gin 与 Validator 的实践之道20241223

深入探讨 Go 中的高级表单验证与翻译&#xff1a;Gin 与 Validator 的实践之道 在现代后端开发中&#xff0c;表单验证是保证数据完整性和服务稳定性的核心环节。如何优雅、高效地实现表单验证&#xff0c;同时提供人性化的错误提示&#xff0c;是每位开发者的必修课。在本文中…

UE5 渲染管线 学习笔记

兰伯特 SSS为散射的意思 带Bias的可以根据距离自动切换mip的卷积值 而带Level的值mipmaps的定值 #define A8_SAMPLE_MASK .a 这样应该就很好理解了 这个只采样a通道 带Level的参考上面的 朝左上和右下进行模糊 带Bias参考上面 随机数 4D 3D 2D 1D HLSL内置UV HLSL内置鼠标坐…

【Kubernetes 指南】基础入门——Kubernetes 基本概念(二)

目录 二、Pod 1、Pod 简介 2、Pod 图示 3、nginx 容器 二、Pod 1、Pod 简介 - Kubernetes 使用 Pod 来管理容器&#xff0c;每个 Pod 可以包含一个或多个紧密关联的容器。 - Pod 是一组紧密关联的容器集合&#xff0c;它们共享 PID、IPC、Network 和 UTS namespace&#…

基于高德地图js api实现掩膜效果 中间矢量 周围卫星图

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>管网服务</title><style>html,body,#ma…

【EI会议征稿】人工智能与遥感应用国际会议 (AIRSA 2025)

第一届人工智能与遥感应用国际学术会议&#xff08;AIRSA 2025&#xff09;将于2025年3月14-17日在中国长沙召开。会议聚焦人工智能与遥感技术应用&#xff0c;旨在为参会专家、学者和相关研究人员提供一个共享科研成果&#xff0c;拓宽研究思路&#xff0c;探索前沿技术&#…

Java圣诞树

目录 写在前面 技术需求 程序设计 代码分析 一、代码结构与主要功能概述 二、代码功能分解与分析 1. 类与常量定义 2. 绘制树的主逻辑 3. 彩色球的绘制 4. 动态效果的实现 5. 窗口初始化 三、关键特性与优点 四、总结 写在后面 写在前面 Java语言绘制精美圣诞树…