PyQt6的界面切换事件

前言

PyQt6 是基于 Qt 框架的 Python 绑定库,广泛应用于开发功能丰富的跨平台桌面应用程序。其核心优势在于提供了完善的 GUI 组件库和灵活的信号槽机制,特别适合构建需要多视图切换的复杂界面系统。通过合理的架构设计,开发者可以轻松实现登录页、主功能面板、设置窗口等多视图的动态切换,满足现代应用模块化交互需求。

在制作这个事件之间,大家可以自己先去了解一下QTDesigner

一.使用QTDesigner制作UI界面

先创建一个“Main Window”的窗口

QFrame 是 PyQt5 中用于创建带有可视化边框/装饰的容器控件,继承自 QWidget。它既能作为独立控件显示分割线或装饰框,也可作为其他控件的容器,通过丰富的样式选项实现界面视觉分层。

我们先拖入两个QFrame 控件

对这两个QFrame 控件进行水平布局

进行这个操作后,会出现一个让人误解的界面

我们只需要将那个短小的缝拖开即可,会出现下面的界面

这个界面中间有两条比较隐约的白线,仔细看是能看到的

我们进行一个简单的设置,让两个QFrame 控件呈现1:5的状态

先选中其中一个QFrame控件,点击QWidget中的sizePolicy(控制控件在布局中如何调整大小的核心属性,它定义了控件对空间分配的自适应策略,直接影响界面在不同窗口尺寸下的表现)

水平策略选择Expanding(控件主动争取空间,在布局中占据更多可用区域,优先级高于 Preferred),垂直策略也选择Expanding,水平伸展选择1

另一个QFrame控件中的水平策略和垂直策略都一样选择Expanding,水平伸展选择5

把这几张图中进行对比,可以看出两个QFrame 控件5:1的效果

先拖入三个QPushButton控件,再拖入一个QStackedWidget控件

先在QStackedWidget控件中,加入一个TextLabel控件,名字“界面1”

点击圈选的按键,切换第二个界面加入一个TextLabel控件,名字“界面2”

由于我们拖入了三个QPushButton控件,所以这里我们也加入三个界面。可能,大家会根据前面的操作,继续点击圈选的按键,切换进第三个界面,但实际上并不会成功,这是一个坑。

右键点击“插入页”中的“在当前页之前”,切换进第三个界面,再加入一个TextLabel控件,名字“界面3”,点击保存。

到这里,我们使用QTDesigner制作UI界面的任务就完成了

二.控制界面切换

接下来,使用PYULC生成代码,具体PYULC是什么,大家可以自己查询别的帖子了解一下

为了区分,三个QPushButton控件分别命名为按键一、按键二、按键三。点击按键切换界面,这部分需要通过代码部分解决

下面是我转换的ui代码,按键转换.py

# Form implementation generated from reading ui file '按键转换.ui'
#
# Created by: PyQt6 UI code generator 6.4.2
#
# 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(905, 711)
        self.centralwidget = QtWidgets.QWidget(parent=MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.widget = QtWidgets.QWidget(parent=self.centralwidget)
        self.widget.setGeometry(QtCore.QRect(10, 10, 891, 651))
        self.widget.setObjectName("widget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.frame_2 = QtWidgets.QFrame(parent=self.widget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding)
        sizePolicy.setHorizontalStretch(1)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.frame_2.sizePolicy().hasHeightForWidth())
        self.frame_2.setSizePolicy(sizePolicy)
        self.frame_2.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
        self.frame_2.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
        self.frame_2.setObjectName("frame_2")
        self.frame = QtWidgets.QFrame(parent=self.frame_2)
        self.frame.setGeometry(QtCore.QRect(150, 0, 736, 649))
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding)
        sizePolicy.setHorizontalStretch(5)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.frame.sizePolicy().hasHeightForWidth())
        self.frame.setSizePolicy(sizePolicy)
        self.frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
        self.frame.setObjectName("frame")
        self.stackedWidget = QtWidgets.QStackedWidget(parent=self.frame)
        self.stackedWidget.setGeometry(QtCore.QRect(0, 10, 731, 641))
        self.stackedWidget.setObjectName("stackedWidget")
        self.page = QtWidgets.QWidget()
        self.page.setObjectName("page")
        self.label = QtWidgets.QLabel(parent=self.page)
        self.label.setGeometry(QtCore.QRect(330, 190, 91, 71))
        self.label.setObjectName("label")
        self.stackedWidget.addWidget(self.page)
        self.page_2 = QtWidgets.QWidget()
        self.page_2.setObjectName("page_2")
        self.label_2 = QtWidgets.QLabel(parent=self.page_2)
        self.label_2.setGeometry(QtCore.QRect(340, 210, 54, 16))
        self.label_2.setObjectName("label_2")
        self.stackedWidget.addWidget(self.page_2)
        self.page_3 = QtWidgets.QWidget()
        self.page_3.setObjectName("page_3")
        self.label_3 = QtWidgets.QLabel(parent=self.page_3)
        self.label_3.setGeometry(QtCore.QRect(310, 310, 54, 16))
        self.label_3.setObjectName("label_3")
        self.stackedWidget.addWidget(self.page_3)
        self.pushButton = QtWidgets.QPushButton(parent=self.frame_2)
        self.pushButton.setGeometry(QtCore.QRect(40, 60, 75, 24))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(parent=self.frame_2)
        self.pushButton_2.setGeometry(QtCore.QRect(40, 110, 75, 24))
        self.pushButton_2.setObjectName("pushButton_2")
        self.pushButton_3 = QtWidgets.QPushButton(parent=self.frame_2)
        self.pushButton_3.setGeometry(QtCore.QRect(40, 160, 75, 24))
        self.pushButton_3.setObjectName("pushButton_3")
        self.horizontalLayout.addWidget(self.frame_2)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(parent=MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 905, 22))
        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.stackedWidget.setCurrentIndex(2)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate("MainWindow", "界面1"))
        self.label_2.setText(_translate("MainWindow", "界面2"))
        self.label_3.setText(_translate("MainWindow", "界面3"))
        self.pushButton.setText(_translate("MainWindow", "按键一"))
        self.pushButton_2.setText(_translate("MainWindow", "按键二"))
        self.pushButton_3.setText(_translate("MainWindow", "按键三 "))

下面是核心代码部分,在按键切换Main.py中通过槽信号连接事件

from PyQt6.QtWidgets import QApplication, QMainWindow
import 按键转换  # 确保这个模块存在并且正确导出了Ui_MainWindow
import sys

class page_transition(按键转换.Ui_MainWindow, QMainWindow):
    def __init__(self):
        super(page_transition, self).__init__()
        self.setupUi(self)
        # 连接按钮点击事件到槽函数
        self.pushButton.clicked.connect(self.display_page1)
        self.pushButton_2.clicked.connect(self.display_page2)
        self.pushButton_3.clicked.connect(self.display_page3)

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

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

    def display_page3(self):
        self.stackedWidget.setCurrentIndex(2)

# 确保以下代码只被执行一次
if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window = page_transition()
    main_window.show()
    sys.exit(app.exec())
在代码中,我设置的按键一对应“界面一”,图中可以看到它的CurrentIndex的索引为0

其它两个按键一样,所以他们的CurrentIndex的索引分别为1、2,这就是整体代码的思路

三.演示效果

3月2日

到这里,对pyqt6的界面切换事件就结束,希望对大家的学习有所帮助!!!

### PyQt6 中实现界面之间切换PyQt6 应用程序中,可以通过管理不同窗口部件 (widgets) 的显示状态来实现在多个界面间的平滑切换。具体来说,在 `main.py` 文件中先导入必要的模块: ```python from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton, QWidget, QVBoxLayout import sys ``` 创建主应用程序类并定义用于存储各个页面的对象属性[^1]。 为了实现多页应用中的导航逻辑,可以采用堆栈布局 (`QStackedWidget`) 来容纳不同的页面组件,并通过按钮或其他交互控件触发页面索引的变化从而达到切换效果[^2]。 下面是一个简单的例子展示如何利用 `QStackedWidget` 和信号槽机制完成两个页面间的基本转换操作: ```python class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("PyQt6 页面切换示例") # 初始化 QStackedWidget 作为容器承载各页面 self.stacked_widget = QStackedWidget() # 添加第一个页面到 stacked widget 并设置其内容 page_one = QWidget() layout_page_one = QVBoxLayout(page_one) button_to_two = QPushButton('前往第二页') button_to_two.clicked.connect(self.switch_to_second_page) layout_page_one.addWidget(button_to_two) # 同样处理第二个页面... page_two = QWidget() layout_page_two = QVBoxLayout(page_two) button_back_home = QPushButton('返回首页') button_back_home.clicked.connect(self.return_first_page) layout_page_two.addWidget(button_back_home) # 把这两个页面加入 stack self.stacked_widget.addWidget(page_one) self.stacked_widget.addWidget(page_two) # 设置当前可见的是第一页 self.setCentralWidget(self.stacked_widget) def switch_to_second_page(self): """ 切换至第二页 """ self.stacked_widget.setCurrentIndex(1) def return_first_page(self): """ 返回第一页 """ self.stacked_widget.setCurrentIndex(0) if __name__ == '__main__': app = QApplication(sys.argv) window = MainWindow() window.show() try: sys.exit(app.exec()) except SystemExit as e: pass ``` 对于更复杂的场景比如带有登录验证的情况,则可以在成功认证之后动态加载新的 UI 组件实例化对象,并调用相应方法隐藏旧视图同时展现新视图[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值