2015-03-13 2 views
0

Я создал главное окно в PyQt, у которого есть кнопка. Я хочу использовать эту кнопку для отображения другого окна, а главное окно должно быть закрыто или скрыто. Я написал следующий код, но главное окно не скрывается после нажатия кнопки.Показать другое окно из одного окна в PyQt

from PyQt4 import QtCore, QtGui 

try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    _fromUtf8 = lambda s: s 


#Second window 
class Ui_Dialog(QtGui.QWidget): 
    def setupUi(self, Dialog): 
     Dialog.setObjectName(_fromUtf8("Dialog")) 
     Dialog.setWindowModality(QtCore.Qt.WindowModal) 
     Dialog.resize(400, 300) 
     Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8)) 

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

    def retranslateUi(self, Dialog): 
     pass 

#Main window 
class Ui_MainWindow(QtGui.QWidget): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName(_fromUtf8("MainWindow")) 
     MainWindow.resize(309, 148) 
     MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8)) 
     self.centralwidget = QtGui.QWidget(MainWindow) 
     self.centralwidget.setObjectName(_fromUtf8("centralwidget")) 
     self.pushButton = QtGui.QPushButton(self.centralwidget) 
     self.pushButton.setGeometry(QtCore.QRect(50, 30, 191, 71)) 
     self.pushButton.setText(QtGui.QApplication.translate("MainWindow", "Open Dialog", None, QtGui.QApplication.UnicodeUTF8)) 
     self.pushButton.setObjectName(_fromUtf8("pushButton")) 
     MainWindow.setCentralWidget(self.centralwidget) 

     self.retranslateUi(MainWindow) 

     self.pushButton.clicked.connect(self.showDial) 

     QtCore.QMetaObject.connectSlotsByName(MainWindow) 



    def retranslateUi(self, MainWindow): 
     pass 

    #function to display another form 
    def showDial(self): 
     Dialog = QtGui.QDialog() 
     u = Ui_Dialog() 
     u.setupUi(Dialog) 
     self.close() 
     Dialog.exec_() 
     #self.hide() 
     #self.close() 

if __name__ == "__main__": 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    MainWindow = QtGui.QMainWindow() 
    ui = Ui_MainWindow() 
    ui.setupUi(MainWindow) 
    MainWindow.show() 
    sys.exit(app.exec_()) 
sys.exit(app.exec_()) 

ответ

0

Проблема заключается в том, что в showDial, сам является объектом Ui, а не само окно. Лично мне не нравится создавать отдельные объекты таким образом (я предполагаю, что это вдохновляет дизайнера GUI), но вы можете хранить сам объект в setupUi и ссылаться на него, как это:

class Ui_MainWindow(QtGui.QWidget): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName(("MainWindow")) 
     MainWindow.resize(309, 148) 
     MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8)) 
     self.centralwidget = QtGui.QWidget(MainWindow) 
     self.centralwidget.setObjectName(("centralwidget")) 
     self.pushButton = QtGui.QPushButton(self.centralwidget) 
     self.pushButton.setGeometry(QtCore.QRect(50, 30, 191, 71)) 
     self.pushButton.setText(QtGui.QApplication.translate("MainWindow", "Open Dialog", None, QtGui.QApplication.UnicodeUTF8)) 
     self.pushButton.setObjectName(("pushButton")) 
     MainWindow.setCentralWidget(self.centralwidget) 

     self.pushButton.clicked.connect(self.showDial) 
     self.win = MainWindow 

     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

    #function to display another form 
    def showDial(self): 
     Dialog = QtGui.QDialog() 
     u = Ui_Dialog() 
     u.setupUi(Dialog) 
     self.win.close() 
     Dialog.exec_() 
     #self.hide() 
     #self.close() 

(также отметить, что вы звоните app.exec_() дважды)

простой альтернативой вашей схеме:

MainWindow = Ui_MainWindow() 
    MainWindow.setupUi(MainWindow) #note that self and MainWindow are the same 

и имеют Ui_MainWindow наследовать от QMainWindow вместо QWidget.

Смежные вопросы