PyQt5 QMainWindow主界面跳转实现

前后端不分离的方式实现QMainWindow之间的跳转(不推荐)

在网上找了很久QMainWindow之间的跳转,找到的模板都是如下面这种的,但这种方式其实在用PyQt5进行界面编程时会非常麻烦,因为一般我们先利用QtDesinger生成*.ui文件,再用PyUIC工具转化得到对应的*.py文件,如果采用下面这种方式,每次都需要把修改后的界面代码粘贴过来。在界面复杂时,光是界面代码就已经多了,而且将前端代码和后端代码混合,不利于前后端分离,可能会引起很多问题。在找了很久之后,终于找到了最优的一种方法,特此记录下来。

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
################################################
#######创建主窗口
################################################
class FirstMainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setWindowTitle('主界面')
 
        ###### 创建界面 ######
        self.centralwidget = QWidget()
        self.setCentralWidget(self.centralwidget)
        self.Layout = QVBoxLayout(self.centralwidget)
 
        # 设置顶部三个按钮
        self.topwidget = QWidget()
        self.Layout.addWidget(self.topwidget)
        self.buttonLayout = QHBoxLayout(self.topwidget)
 
        self.pushButton1 = QPushButton()
        self.pushButton1.setText("打开主界面")
        self.buttonLayout.addWidget(self.pushButton1)
 
        self.pushButton2 = QPushButton()
        self.pushButton2.setText("打开对话框")
        self.buttonLayout.addWidget(self.pushButton2)
 
        self.pushButton3 = QPushButton()
        self.pushButton3.setText("打开提示框")
        self.buttonLayout.addWidget(self.pushButton3)
 
 
 
        # 设置中间文本
        self.label = QLabel()
        self.label.setText("第一个主界面")
        self.label.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding))
        self.label.setAlignment(Qt.AlignCenter)
        self.label.setFont(QFont("Roman times", 50, QFont.Bold))
        self.Layout.addWidget(self.label)
 
        # 设置状态栏
        self.statusBar().showMessage("当前用户:一心狮")
 
        # 窗口最大化
        self.showMaximized()
 
        ###### 三个按钮事件 ######
        self.pushButton1.clicked.connect(self.on_pushButton1_clicked)
        self.pushButton2.clicked.connect(self.on_pushButton2_clicked)
        self.pushButton3.clicked.connect(self.on_pushButton3_clicked)
 
 
 
 
    # 按钮一:打开主界面
    windowList = []
    def on_pushButton1_clicked(self):
        the_window =SecondWindow()
        self.windowList.append(the_window)   ##注:没有这句,是不打开另一个主界面的!
        self.close()
        the_window.show()
 
 
    # 按钮二:打开对话框
    def on_pushButton2_clicked(self):
        the_dialog = TestdemoDialog()
        if the_dialog.exec_() == QDialog.Accepted:
            pass
 
 
 
    # 按钮三:打开提示框
    def on_pushButton3_clicked(self):
        QMessageBox.information(self, "提示", "这是information框!")
        #QMessageBox.question(self, "提示", "这是question框!")
        #QMessageBox.warning(self, "提示", "这是warning框!")
        #QMessageBox.about(self, "提示", "这是about框!")
 
 
 
 
 
################################################
#######第二个主界面
################################################
class SecondWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setWindowTitle('第二主界面')
 
        # 设置中间文本
        self.label = QLabel()
        self.label.setText("第二个主界面")
        self.label.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding))
        self.label.setAlignment(Qt.AlignCenter)
        self.label.setFont(QFont("Roman times", 50, QFont.Bold))
        self.setCentralWidget(self.label)
 
        # 设置状态栏
        self.statusBar().showMessage("当前用户:一心狮")
 
        # 窗口最大化
        self.showMaximized()
 
 
 
    ###### 重写关闭事件,回到第一界面
    windowList = []
    def closeEvent(self, event):
        the_window = FirstMainWindow()
        self.windowList.append(the_window)  ##注:没有这句,是不打开另一个主界面的!
        the_window.show()
        event.accept()
 
 
 
 
################################################
#######对话框
################################################
class TestdemoDialog(QDialog):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setWindowTitle('对话框')
 
        ### 设置对话框类型
        self.setWindowFlags(Qt.Tool)
 
 
 
 
 
################################################
#######程序入门
################################################
if __name__ == "__main__":
    app = QApplication(sys.argv)
    the_mainwindow = FirstMainWindow()
    the_mainwindow.show()
    sys.exit(app.exec_())
 

更好的方法实现QMainWindow之间的跳转(推荐)

首先利用QtDesigner和PyUIC工具得到前端代码并且创建界面对应的后端代码:

first_window.py: 第一个界面的前端代码

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

# Form implementation generated from reading ui file 'demo.ui'
#
# Created by: PyQt5 UI code generator 5.11.3
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(558, 483)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(195, 186, 191, 51))
        font = QtGui.QFont()
        font.setFamily("黑体")
        font.setPointSize(14)
        font.setBold(True)
        font.setWeight(75)
        self.pushButton.setFont(font)
        self.pushButton.setObjectName("pushButton")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 558, 18))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "打开另一界面"))


对应的界面为:

在这里插入图片描述

another_window.py:第二个界面的前端代码

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

# Form implementation generated from reading ui file 'another_window.ui'
#
# Created by: PyQt5 UI code generator 5.11.3
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(433, 413)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(170, 208, 181, 41))
        font = QtGui.QFont()
        font.setFamily("黑体")
        font.setPointSize(20)
        self.label.setFont(font)
        self.label.setObjectName("label")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 433, 18))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate("MainWindow", "另一个界面"))

对应的界面为:

在这里插入图片描述

another_window_actions.py:第二个界面的后端代码

import sys
import another_window
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QFileDialog, QMessageBox
from PyQt5 import QtWidgets

class AnotherWindowActions(another_window.Ui_MainWindow, QMainWindow):

    def __init__(self):

        super(another_window.Ui_MainWindow, self).__init__()

        self.setupUi(self)


first_window_actions.py:第一个界面对应的话后端代码

import sys
import first_window
import another_window_actions
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QFileDialog, QMessageBox
from PyQt5 import QtWidgets

# 注意这里定义的第一个界面的后端代码类需要继承两个类
class FirstWindowActions(first_window.Ui_MainWindow, QMainWindow):

    def __init__(self):
		
        super(first_window.Ui_MainWindow, self).__init__()
        # 创建界面
        self.setupUi(self)

        self.pushButton.clicked.connect(self.open_btn_clicked)

    def open_btn_clicked(self):
        “”“
        	点击相应按钮,跳转到第二个界面
        ”“”
		# 实例化第二个界面的后端类,并对第二个界面进行显示
        self.another_window = another_window_actions.AnotherWindowActions()
        self.another_window.show()


if __name__ == '__main__':
	
    # 这里是界面的入口,在这里需要定义QApplication对象,之后界面跳转时不用再重新定义,只需要调用show()函数即可
    app = QApplication(sys.argv)
	
    # 显示创建的界面
    demo_window = FirstWindowActions()
    demo_window.show()

    sys.exit(app.exec_())

点击跳转后的结果为:

在这里插入图片描述

  • 22
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 可以使用 PyQt5 中的 QStackedWidget 组件来实现多层界面跳转。QStackedWidget 是一个容器组件,可以放置多个子窗口,并提供了设置当前可见子窗口的方法。 例如,我们可以在窗口中创建一个 QStackedWidget 对象,并在其中放置多个自定义的 QWidget 子窗口。然后,可以使用 QStackedWidget 的 setCurrentIndex() 方法或 setCurrentWidget() 方法来设置当前可见的子窗口。 下面是一个简单的示例代码: ``` from PyQt5.QtWidgets import QApplication, QMainWindow, QStackedWidget, QWidget class MainWindow(QMainWindow): def __init__(self): super().__init__() # 创建 QStackedWidget 对象 self.stacked_widget = QStackedWidget(self) # 创建多个 QWidget 子窗口 self.page1 = QWidget() self.page2 = QWidget() # 将子窗口添加到 QStackedWidget 中 self.stacked_widget.addWidget(self.page1) self.stacked_widget.addWidget(self.page2) # 设置窗口的布局 self.setCentralWidget(self.stacked_widget) def show_page1(self): # 设置 page1 为当前可见的子窗口 self.stacked_widget.setCurrentWidget(self.page1) if __name__ == '__main__': app = QApplication([]) window = MainWindow() window.show() app.exec_() ``` 在这个例子中,我们在窗口中创建了一个 QStackedWidget 对象,并在其中添加了两个 QWidget 子窗口。然后,可以使用 show_page1() 方法来设置 page1 为当前可 ### 回答2: 在基于pythonpyqt5的框架中,可以使用信号槽机制来实现多层界面跳转。下面是一个简单的示例代码来说明如何实现多层界面跳转: ```python import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("界面") self.setGeometry(200, 200, 300, 200) self.button = QPushButton("跳转到第二层界面", self) self.button.setGeometry(100, 100, 150, 30) self.button.clicked.connect(self.goto_second_window) def goto_second_window(self): self.hide() # 隐藏界面 second_window = SecondWindow(self) second_window.show() class SecondWindow(QMainWindow): def __init__(self, main_window): super().__init__() self.setWindowTitle("第二层界面") self.setGeometry(200, 200, 300, 200) self.button = QPushButton("返回界面", self) self.button.setGeometry(100, 100, 150, 30) self.button.clicked.connect(self.goto_main_window) self.main_window = main_window def goto_main_window(self): self.hide() # 隐藏当前界面 self.main_window.show() # 显示界面 if __name__ == "__main__": app = QApplication(sys.argv) main_window = MainWindow() main_window.show() sys.exit(app.exec_()) ``` 在这个例子中,我们创建了两个继承自QMainWindow的类,分别是`MainWindow`和`SecondWindow`。在界面的初始化函数中,我们创建了一个按钮用于跳转到第二层界面。当用户点击按钮时,我们调用`goto_second_window`函数隐藏界面,并创建并显示第二层界面。 在第二层界面的初始化函数中,我们创建了一个按钮用于返回界面。当用户点击按钮时,我们调用`goto_main_window`函数隐藏当前界面,并显示界面。 通过这样的方式,我们可以实现多层界面跳转。当需要跳转到下一层界面时,我们隐藏当前界面并创建并显示新的界面;当需要返回上一层界面时,我们隐藏当前界面并显示上一层界面。这样就可以实现多层界面跳转了。 ### 回答3: 基于PythonPyQt5库,我们可以实现多层界面跳转,下面是一个实现的简单例子。 首先,我们需要导入PyQt5库中的一些模块: ``` from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout ``` 然后,我们定义一个继承自QWidget的窗口类,我们称之为MainWindow。在该窗口中,我们可以点击一个按钮,跳转到另一个继承自QWidget的子窗口类,我们称之为ChildWindow。 ``` class ChildWindow(QWidget): def __init__(self): super().__init__() layout = QVBoxLayout() button = QPushButton("返回界面") button.clicked.connect(self.go_back) layout.addWidget(button) self.setLayout(layout) def go_back(self): self.close() # 关闭当前子窗口 self.parent().show() # 显示窗口 class MainWindow(QWidget): def __init__(self): super().__init__() layout = QVBoxLayout() button = QPushButton("进入子界面") button.clicked.connect(self.go_to_child) layout.addWidget(button) self.setLayout(layout) def go_to_child(self): self.hide() # 隐藏窗口 child_window = ChildWindow() child_window.setParent(self) child_window.show() ``` 最后,我们创建一个QApplication对象,并显示窗口: ``` if __name__ == '__main__': app = QApplication([]) main_window = MainWindow() main_window.show() app.exec_() ``` 以上示例代码实现了一个简单的多层界面跳转,点击窗口中的按钮,会跳转到子窗口;在子窗口中点击按钮,会返回到窗口。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值