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

Posted

技术标签:

【中文标题】PyQT:如何从另一个对话框(QMainWindow)中调用对话框【英文标题】:PyQT: How to call Dialog from within another Dialog (QMainWindow) 【发布时间】:2014-03-06 03:18:42 【问题描述】:

运行下面发布的代码会带来一个带有一个按钮的Dialog_01 QMainWindow。 单击该按钮应关闭此窗口 (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】:

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_()

【讨论】:

干得好!非常感谢!

以上是关于PyQT:如何从另一个对话框(QMainWindow)中调用对话框的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个类 PyQT 向 QComboBox 添加项目?

如何从另一个 python 脚本调用和显示 PYQT UI 脚本?

PyQt MenuBar Mac OSX 雪豹

PyQt - 从另一个线程修改 GUI

PyQt:定时器不能从另一个线程启动

从另一个 GUI 文件 PyQT5 打开 GUI 文件