前言
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的界面切换事件就结束,希望对大家的学习有所帮助!!!