PY Qt 从 QMainWindow 打开 QDialog

PPr*_*eus 0 python pyqt pyqt4 qt-designer python-2.7

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

def OpenDialogue(self):

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

    return
Run Code Online (Sandbox Code Playgroud)

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

MainWindow 构造函数如下:

class Ui_MainWindow(QtGui.QMainWindow, object):

    def setupUi(self, MainWindow):
        [code]
Run Code Online (Sandbox Code Playgroud)

它的实例化如下:

app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = GUI.Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
app.exec_()
Run Code Online (Sandbox Code Playgroud)

eyl*_*esc 5

我将分别通过 MainWindow 和 Dialog 模板对 Qt Designer 生成的类调用 Ui_MainWindow 和 Ui_Dialog。那么最好创建 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()
Run Code Online (Sandbox Code Playgroud)

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

def openDialog(self):
    d = Dialog(self)
    d.exec_()
Run Code Online (Sandbox Code Playgroud)

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