Question

Well, this is a problem that has been bugging me for few days. I'm trying to open a Ui_form from a MainWindow. For some reason the child window opens and closes instantly.

class Ui_MainWindow(QtGui.QMainWindow):
    def __init__(self,parent=None):
        QtGui.QMainWindow.__init__(self,parent)

    def setupUi(self, MainWindow):
        # Some Gui Code
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(406, 234)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.verticalLayout = QtGui.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
        self.horizontalLayout = QtGui.QHBoxLayout()
        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
        self.listView = QtGui.QListView(self.centralwidget)
        self.listView.setObjectName(_fromUtf8("listView"))
        self.horizontalLayout.addWidget(self.listView)
        self.pushButton = QtGui.QPushButton(self.centralwidget)
        self.pushButton.setObjectName(_fromUtf8("pushButton"))
        self.horizontalLayout.addWidget(self.pushButton)
        self.verticalLayout.addLayout(self.horizontalLayout)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 406, 21))
        self.menubar.setObjectName(_fromUtf8("menubar"))
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QObject.connect(self.pushButton , QtCore.SIGNAL("clicked()") , self.NewLog)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton.setText(QtGui.QApplication.translate("MainWindow", "New Log", None, QtGui.QApplication.UnicodeUTF8))



    def NewLog(self):
        app = QtGui.QWidget()
        myapp = new_application_log.Ui_Form()
        myapp.setupUi(app)
        myapp.show()
        #app.exec_()

class Ui_Form(QtGui.QWidget):
    def __init__(self,parent = None):
        QtGui.QWidget.__init__(self,parent)

    def setupUi(self, Form):
        # Some Gui Code.
        Form.setObjectName(_fromUtf8("Form"))
        Form.resize(312, 269)
        self.verticalLayout = QtGui.QVBoxLayout(Form)
        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
        self.listView = QtGui.QListView(Form)
        self.listView.setObjectName(_fromUtf8("listView"))
        self.verticalLayout.addWidget(self.listView)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        Form.setWindowTitle(QtGui.QApplication.translate("Form", "Form", None, QtGui.QApplication.UnicodeUTF8))

def main():
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow() # <-- Instantiate QMainWindow object.
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    app.exec_()
Was it helpful?

Solution

The simplest solution is to change your newLog to this

def NewLog(self):
    app = QtGui.QWidget()
    self.form = Ui_Form()
    self.form.setupUi(app)
    self.form.show()

with the self.form defined in the Ui_mainwindow class

class Ui_MainWindow(QtGui.QMainWindow):
    def __init__(self,parent=None):
        QtGui.QMainWindow.__init__(self,parent)

        self.form = None

In your code, you are defining the myapp = Ui_form() variable inside of the newLog function and then it is going out of scope and being deleted right when the function exits. If you were to somehow include some blocking of the function ending you wouldn't technically need to put self.form in the __init__() of Ui_mainWindow. Say, for instance, you had a form that would return require a button hit to close, then you could just do it as you had it, but since you're just show()ing a widget, you need to have it survive outside of the function.


Edit: For instance, this code would run just fine for the above stated reason--you have to click the button before the function exits

def NewLog(self, text='I am open!', buttons=QtGui.QMessageBox.Ok):
   errorBox = QtGui.QMessageBox()
   errorBox.setText(text)
   errorBox.setStandardButtons(buttons)
   return errorBox.exec_()
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top