返回上一个窗口
Posted
技术标签:
【中文标题】返回上一个窗口【英文标题】:Returning to a previous window 【发布时间】:2017-09-03 08:48:19 【问题描述】:我正在使用 Qt creator 为我的论文创建一个 GUI。我正在研究按钮的功能以转到一个窗口并返回到前一个窗口。
我已经完成了转到另一个窗口的功能。
我在时遇到问题。我总是收到错误 formTrain.hide()
未定义。
我该如何解决这个错误?
主窗口代码
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from testsys_auto import Ui_testsys
from trainsys_auto import *
class Ui_MainWindow(object):
def trainsys(self):
self.trainwin = QtWidgets.QMainWindow()
self.ui = Ui_trainsys()
self.ui.setupUi(self.trainwin)
formMain.hide()
self.trainwin.show()
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(405, 307)
self.centralWidget = QtWidgets.QWidget(MainWindow)
self.centralWidget.setObjectName("centralWidget")
self.verticalLayoutWidget = QtWidgets.QWidget(self.centralWidget)
self.verticalLayoutWidget.setGeometry(QtCore.QRect(110, 120, 160, 107))
self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setObjectName("verticalLayout")
self.btn_TrainSys = QtWidgets.QPushButton(self.verticalLayoutWidget)
self.btn_TrainSys.setObjectName("btn_TrainSys")
self.verticalLayout.addWidget(self.btn_TrainSys)
self.btn_TrainSys.clicked.connect(self.trainsys)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "Home Screen"))
self.btn_TrainSys.setText(_translate("MainWindow", "Train System"))
self.label.setText(_translate("MainWindow", "Diabetic Retinopathy Detection"))
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
formMain = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(formMain)
formMain.show()
sys.exit(app.exec_())
trainsys
窗口的代码
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from mainwindow1 import *
class Ui_trainsys(object):
def backhome(self):
self.backwin = QtWidgets.QMainWindow()
self.ui = Ui_MainWindow()
self.ui.setupUi(self.backwin)
formTrain.hide()
self.backwin.show()
def setupUi(self, trainsys):
self.btn_Backtrain = QtWidgets.QPushButton(self.verticalLayoutWidget)
self.btn_Backtrain.setObjectName("btn_Backtrain")
self.btn_Backtrain.clicked.connect(self.backhome)
def retranslateUi(self, trainsys):
_translate = QtCore.QCoreApplication.translate
trainsys.setWindowTitle(_translate("trainsys", "Train System")
self.btn_Backtrain.setText(_translate("trainsys", "Back to Home Screen"))
self.label.setText(_translate("trainsys", "Train System"))
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
formTrain = QtWidgets.QMainWindow()
ui = Ui_trainsys()
ui.setupUi(formTrain)
formTrain.show()
sys.exit(app.exec_())
【问题讨论】:
【参考方案1】:始终建议不要修改 Qt Designer 生成的类,如果您是初学者,请不要修改该代码。最简单、最优雅的方法是创建实现逻辑的类并使用初始类的设计。
假设您在使用 Qt Designer 创建视图时使用了 MainWindow 模板,那么实现逻辑的类应具有以下形式:
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
QtWidgets.QMainWindow.__init__(self, parent)
self.setupUi(self)
class Trainsys(QtWidgets.QMainWindow, Ui_trainsys):
def __init__(self, parent=None):
QtWidgets.QMainWindow.__init__(self, parent)
self.setupUi(self)
在你的情况下返回的逻辑是隐藏当前窗口并显示窗口,为此我们创建以下函数:
def changeWindow(w1, w2):
w1.hide()
w2.show()
然后我们使用 lambda 函数在您单击每个按钮时调用它们:
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
main = MainWindow()
trainsys = Trainsys()
main.btn_TrainSys.clicked.connect(lambda: changeWindow(main, trainsys))
trainsys.btn_Backtrain.clicked.connect(lambda: changeWindow(trainsys, main))
main.show()
sys.exit(app.exec_())
注意:如果你修改了这些类,你只需要在 pyuic 的帮助下使用 .ui 文件生成返回值。
【讨论】:
感谢您的回答。对我来说创建一个单独的 python 文件是否更好,我将在其中导入由 Qt 设计器生成的主窗口和 trainsys 的类?我将放置您提供的第一组代码? 为了更好的代码排序方式更好,只需导入设计,即UI_xxx,然后复制我提出的所有代码。以上是关于返回上一个窗口的主要内容,如果未能解决你的问题,请参考以下文章
java+selenium+new——返回上一个访问的网页(模拟单击浏览器的后退功能),同一个标签窗口里