[PySide] open/close QMdiArea subwindows

Joel B. Mohler jmohler at gamry.com
Mon Feb 25 18:14:19 CET 2013


On 2/23/2013 4:55 AM, Stefan Champailler wrote:
> Well, I'm not sure but according to the Qmdiarea doc,
> addSubwindow does not take ownership of the window.
> So when the execution path leaves newkid(), w is deleted
> and then QMdiArea looses it as well...
>
> (but I just read the doc, didn't test)

I don't think that justifies the crash.  If the w widget goes out of 
scope then the widget should have never appeared (being entirely torn 
down by python reference counting on its way out of scope). Either way, 
I've reported it at https://bugreports.qt-project.org/browse/PYSIDE-144 
because I don't think that my app-side python reference issues should 
cause C level segfault crashes.

Joel

On 02/21/2013 11:45 PM, Joel B. Mohler wrote:
>> TL;DR;  QMdiArea claims to take any QWidget in the addSubWindow method.
>> However, in PySide, this appears to work but it will almost certainly
>> segfault after many (or few) open/close cycles.
>>
>> I get a segfault in both windows and linux on the following code. After
>> opening and closing the window created in "newkid" 4-50 times.  I simply
>> start the program and press Ctrl+F5, Ctrl+W repeatedly activating the
>> QAction and using the platform specific close sub-window shortcut.   The
>> nondescript newkid widget appears and disappears until on some open I
>> get a segfault.
>>
>> #!/usr/bin/env python
>>
>> from PySide import QtCore, QtGui
>>
>> class MainWin(QtGui.QMainWindow):
>>        def __init__(self, parent=None):
>>            super(MainWin, self).__init__(parent)
>>
>>            self.setCentralWidget(QtGui.QMdiArea())
>>
>>            self.myaction = QtGui.QAction("add win", self)
>>            self.myaction.setShortcut("Ctrl+F5")
>>            self.myaction.triggered.connect(self.newkid)
>>            self.addAction(self.myaction)
>>
>>        def newkid(self):
>>            w = QtGui.QWidget()
>>            w.setWindowTitle("hi there")
>>            w.setAttribute(QtCore.Qt.WA_DeleteOnClose)
>>            self.centralWidget().addSubWindow(w)
>>            w.showMaximized()
>>
>> if __name__ == '__main__':
>>        app = QtGui.QApplication([])
>>        w = MainWin()
>>        w.show()
>>        app.exec_()
>>
>> Both systems are running PySide 1.1.2 and Qt 4.8.x.
>>
>> Indeed, I've modified the example to make a QMdiSubWindow rather than a
>> QWidget and I have yet to have it crash for me after pounding on the F5
>> & W keys as described above.  I think I have a fix then for the
>> immediate issue, but I guess this is a bug for the bug tracker as well
>> since the qmdiarea docs imply this should work.  I think I'm with-in
>> bounds for the documentation at
>> http://qt-project.org/doc/qt-4.8/qmdiarea.html#addSubWindow .
>>
>> Joel
>>
>> (Side-note:  this is one of the other things that went wrong in my
>> thread about "RuntimeError:  Failed to connect signal" ... the bug hunt
>> is wide open I guess and expect I'll find other issues)
>> _______________________________________________
>> PySide mailing list
>> PySide at qt-project.org
>> http://lists.qt-project.org/mailman/listinfo/pyside
>>




More information about the PySide mailing list