2017-06-21 106 views
0

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

def OpenDialogue(self): 

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

    return 

例如,我应该实例化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_() 
+0

您可以显示主窗口类的构造函数 – eyllanesc

+0

请告诉我什么我问,除了你可以尝试:)'DialogueWindow = QtGui.QDialog(个体经营)' – eyllanesc

+0

如果我改变'DialogueWindow.show(''到DialogueWindow.exec _()',它的工作原理! – PProteus

回答

1

我会打电话给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() 

另一种解决方案是通过在非模态模式打开窗口

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

注使用exec_():不建议修改由Qt设计师生成的类。

+0

这是一个很好的提示,从自动生成的类继承。我每次必须重新生成自动生成的代码时都会一丝不苟。 – PProteus