PY Qt从QMainWindow打开QDialog

时间:2017-06-21 18:28:32

标签: python python-2.7 pyqt pyqt4 qt-designer

我正在使用QT Designer生成的python代码。我想通过MainWindow上的按钮打开一个新对话框。当我使用以下代码时,对话窗口一旦创建就会消失。我假设这是因为当方法命中return语句时,QDialog对象被销毁。这种对话的正确方法是什么?

def OpenDialogue(self):

    DialogueWindow = QtGui.QDialog()
    my_dialogue = MyDialogue.Ui_Dialog()
    my_dialogue.setupUi(DialogueWindow)
    DialogueWindow.show()

    return

例如,我应该在我定义MainWindow的同一个地方实例化DialogueWindow并将其传递给此方法吗?

MainWindow构造函数如下:

class Ui_MainWindow(QtGui.QMainWindow, object):

    def setupUi(self, MainWindow):
        [code]

实例化如下:

app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = GUI.Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
app.exec_()

1 个答案:

答案 0 :(得分:3)

我将分别通过MainWindow和Dialog模板将Ui_MainWindow和Ui_Dialog调用到Qt Designer生成的类中。然后最好创建MainWindow和Dialog实现接口的类。我将pushButton调用到您引用的按钮,然后您必须将父对象传递给对话框对象。

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        [...]

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        [...]

class Dialog(QtGui.QDialog, Ui_Dialog):
    def __init__(self, parent=None):
        QtGui.QDialog.__init__(self, parent)
        self.setupUi(self)


class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        self.setupUi(self)
        self.pushButton.clicked.connect(self.openDialog)

    def openDialog(self):
        d = Dialog(self)
        d.show()

另一种解决方案是通过在非模态模式下打开窗口来使用exec_()

def openDialog(self):
    d = Dialog(self)
    d.exec_()

注意:建议不要修改Qt Designer生成的类。