PyQT:如何从另一个对话框(QMainWindow)中调用对话框

0 投票
1 回答
3044 浏览
提问于 2025-04-17 21:02

下面的代码运行后会出现一个叫Dialog_01的窗口,上面有一个按钮。点击这个按钮应该会关闭Dialog_01窗口,并且打开另一个窗口Dialog_02,这个窗口几乎和第一个一模一样。再点击Dialog_02的按钮会关闭它,并重新打开Dialog_01。运行代码时没有错误,但Dialog_02并没有显示出来,尽管它已经被声明了。我到底漏掉了什么呢?

from PyQt4 import QtCore, QtGui    


class Dialog_02(QtGui.QMainWindow):
    def __init__(self):
        super(Dialog_02, self).__init__()

        myQWidget = QtGui.QWidget()
        myBoxLayout = QtGui.QVBoxLayout()       

        Button_02 = QtGui.QPushButton("Press to close this dialog 02 and re-open Dialog 01")
        Button_02.clicked.connect(self.callAnotherQMainWindow)
        myBoxLayout.addWidget(Button_02)

        myQWidget.setLayout(myBoxLayout)
        self.setCentralWidget(myQWidget)

    def callAnotherQMainWindow(self):
        print "This is supposed to call Dialog_01"



class Dialog_01(QtGui.QMainWindow):
    def __init__(self):
        super(Dialog_01, self).__init__()

        myQWidget = QtGui.QWidget()
        myBoxLayout = QtGui.QVBoxLayout()       

        Button_01 = QtGui.QPushButton("Press to close this dialog and open Dialog 02")
        Button_01.clicked.connect(self.callAnotherQMainWindow)
        myBoxLayout.addWidget(Button_01)        

        myQWidget.setLayout(myBoxLayout)
        self.setCentralWidget(myQWidget)

    def callAnotherQMainWindow(self):
        dialog_1.hide()

        dialog_2 = Dialog_02()
        dialog_2.resize(480,320)
        dialog_2.show()
        dialog_2.raise_() 


dialog_1 = Dialog_01()
dialog_1.show()
dialog_1.resize(480,320)
sys.exit(app.exec_())

后续编辑:已修复的版本

错误在于使用了dialog.hide()而不是dialog.close()。在显示第二个对话框之前,必须先关闭第一个对话框,而不是将其隐藏。

from PyQt4 import QtCore, QtGui    
app = QtGui.QApplication(sys.argv)

class Dialog_02(QtGui.QMainWindow):
    def __init__(self):
        super(Dialog_02, self).__init__()

        myQWidget = QtGui.QWidget()
        myBoxLayout = QtGui.QVBoxLayout()       

        Button_02 = QtGui.QPushButton("Press to close this dialog 02 and re-open Dialog 01")
        Button_02.clicked.connect(self.callAnotherQMainWindow)
        myBoxLayout.addWidget(Button_02)

        myQWidget.setLayout(myBoxLayout)
        self.setCentralWidget(myQWidget)
        self.setWindowTitle('Dialog 02')

    def callAnotherQMainWindow(self):
        self.close()
        self.dialog_01 = Dialog_01()
        self.dialog_01.show()
        self.dialog_01.raise_()



class Dialog_01(QtGui.QMainWindow):
    def __init__(self):
        super(Dialog_01, self).__init__()

        myQWidget = QtGui.QWidget()
        myBoxLayout = QtGui.QVBoxLayout()       

        Button_01 = QtGui.QPushButton("Press to close this dialog and open Dialog 02")
        Button_01.clicked.connect(self.callAnotherQMainWindow)
        myBoxLayout.addWidget(Button_01)        

        myQWidget.setLayout(myBoxLayout)
        self.setCentralWidget(myQWidget)
        self.setWindowTitle('Dialog 01')

    def callAnotherQMainWindow(self):
        self.close()
        self.dialog_02 = Dialog_02()
        self.dialog_02.show()
        self.dialog_02.raise_()

dialog_1 = Dialog_01()
dialog_1.show()
dialog_1.resize(480,320)
sys.exit(app.exec_())

1 个回答

1

Dialog_02 类中,修改以下方法:

def callAnotherQMainWindow(self)
    self.close()
    self.dialog_01 = Dialog_01()
    self.dialog_01.show()
    self.dialog_01.raise_()

然后在 Dialog_01 类中,修改以下方法:

def callAnotherQMainWindow(self)
    self.close()
    self.dialog_02 = Dialog_02()
    self.dialog_02.show()
    self.dialog_02.raise_()

撰写回答