2017-02-23 260 views
0

我已将其他文件链接到我的主窗口中的pushButton。每次点击它,新窗口都会打开,但旧的(主窗口)仍然存在。如何关闭或隐藏它,而不影响新窗口。如何在使用PyQt5打开新窗口时隐藏当前窗口

PS:我是一个新来的人。对于在我的部分发布此查询时发生的任何意见或错误表示歉意。谢谢!

下面是相关代码:

import sys 
    from PyQt5 import QtCore, QtGui, QtWidgets 
    from create2 import Ui_MainWindow 
    from PyQt5.QtWidgets import QMainWindow, QWidget 
    from PyQt5.QtCore import QMargins 

    class Ui_Form(object): 
     def setupUi(self, Form): 
      Form.setObjectName("Form") 
      Form.resize(813, 655) 
      self.widget = QtWidgets.QWidget(Form) 
      self.widget.setGeometry(QtCore.QRect(190, 50, 501, 591)) 
      self.widget.setObjectName("widget") 
      . 
      . 
      . 
     def newusr_clk(self): 
      self.mainwin=QMainWindow() 
      self.ui=Ui_MainWindow() 
      self.ui.setupUi(self.mainwin) 
      self.mainwin.show() 
+0

'window.hide()'或' window.close()的'。 – ekhumoro

+0

当我使用两者中的任何一个时,我收到一个错误,说没有这样的属性。 –

+0

在继承'QWidget'的任何类的实例上使用它们。 – ekhumoro

回答

-1

所以我终于想出了如何在打开新窗口时隐藏当前窗口。这是在我的情况的代码(因为我是用表格的工作):

if __name__ == "__main__": 
    import sys 
    app = QtWidgets.QApplication(sys.argv) 
    Form = QtWidgets.QWidget() 
    ui = Ui_Form() 
    ui.setupUi(Form) 
    Form.show() 
    sys.exit(app.exec_()) 

所以我用这个命令来隐藏当前窗口:

Form.setVisible(False) 
+0

什么是表?你能不能也请展示你'Ui_Form'类? – Crispin

+0

当然,你可以调用'Form.hide()',如果你可以调用'Form.show()'。 – Crispin

1

下面是一个完整的工作示例。主窗口只是一个QMainWindow。它会在点击按钮时打开QDialog。其UI定义:

# file ui_main.py 
from PyQt5 import QtCore, QtWidgets 

class Ui_MainWindow: 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName("MainWindow") 
     MainWindow.resize(442, 205) 
     self.centralwidget = QtWidgets.QWidget(MainWindow) 
     self.centralwidget.setObjectName("centralwidget") 
     self.pushButton = QtWidgets.QPushButton(self.centralwidget) 
     self.pushButton.setGeometry(QtCore.QRect(180, 80, 75, 23)) 
     self.pushButton.setObjectName("pushButton") 
     MainWindow.setCentralWidget(self.centralwidget) 

     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", "PushButton")) 

#file ui_dialog.py 
from PyQt5 import QtCore, QtWidgets 

class Ui_Dialog: 
    def setupUi(self, Dialog): 
     Dialog.setObjectName("Dialog") 
     Dialog.resize(508, 300) 
     self.buttonBox = QtWidgets.QDialogButtonBox(Dialog) 
     self.buttonBox.setGeometry(QtCore.QRect(150, 250, 341, 32)) 
     self.buttonBox.setOrientation(QtCore.Qt.Horizontal) 
     self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok) 
     self.buttonBox.setObjectName("buttonBox") 
     self.buttonBox.accepted.connect(Dialog.accept) 
     self.buttonBox.rejected.connect(Dialog.reject) 
     QtCore.QMetaObject.connectSlotsByName(Dialog) 

在另一个文件中,定义了MainWindowPreferenceDialog类:

# file main.py 
from PyQt5.QtWidgets import QMainWindow, QApplication, QDialog 

from ui_dialog import Ui_Dialog 
from ui_main import Ui_MainWindow 

class MainWindow(QMainWindow): 

    def __init__(self, parent=None): 
     super(MainWindow, self).__init__(parent) 

     self.ui = Ui_MainWindow() 
     self.ui.setupUi(self) 

     self.ui.pushButton.clicked.connect(self.newusr_clk) 

newuser_clk槽会隐藏MainWindow并通过dialog.exec()开辟了一条新QDialog箱。当QDialog关闭时,MainWindow再次显示。

def newusr_clk(self): 
     self.hide() 
     dialog = PreferencesDialog(parent=self) 
     if dialog.exec(): 
      pass # do stuff on success 
     self.show() 

这里是PreferenceDialog类:

class PreferencesDialog(QDialog): 
    def __init__(self, parent=None): 
     super(PreferencesDialog, self).__init__(parent) 

     self.ui = Ui_Dialog() 
     self.ui.setupUi(self) 

这里是如何运行脚本:

if __name__ == '__main__': 
    import sys 

    app = QApplication(sys.argv) 
    window = MainWindow() 
    window.show() 
    sys.exit(app.exec_()) 

希望帮助!

+0

的问题,再次是self.hide()的生产是在我的情况下丢失属性错误。所以这不工作,要么:( –

+1

您展示该解决方案的目的是要表明,也与标准PyQt的做法相一致的工作方法。 – Crispin