[PyQt] QMdiArea persistence issue with closed windows
Hans-Peter Jansen
hpj at urpla.net
Wed Oct 13 14:44:58 BST 2010
Hi Phil,
while looking at dynamic resizing widgets on irc, David Boddie created a
small script, that I improved a little bit, which shows a small bug
with mdi windows. According to the doc of QMdiArea::addSubWindow,
closing windows should stay hidden, but if you close the mdi window,
and adds another button, it tracebacks with:
Traceback (most recent call last):
File "dynresize.py", line 29, in addRow
if self.subwindow.isHidden():
RuntimeError: underlying C/C++ object has been deleted
Here the code:
#!/usr/bin/env python
from PyQt4.QtCore import QTimer
from PyQt4.QtGui import *
import os, sys
class Window(QWidget):
def __init__(self):
QWidget.__init__(self)
self._buttonNr = 1
mdi = QMdiArea()
frame = QFrame()
self.frameLayout = QVBoxLayout(frame)
self.subwindow = mdi.addSubWindow(frame)
button = QPushButton("Add button")
button.clicked.connect(self.addRow)
layout = QVBoxLayout(self)
layout.addWidget(mdi)
layout.addWidget(button)
def addRow(self):
if self.subwindow.isHidden():
self.subwindow.show()
button = QPushButton("Remove button %i" % self._buttonNr)
button.clicked.connect(self.delRow)
self._buttonNr += 1
self.frameLayout.addWidget(button)
QTimer.singleShot(0, self.subwindow.adjustSize)
def delRow(self):
button = self.sender()
button.hide()
self.frameLayout.removeWidget(button)
button.deleteLater()
QTimer.singleShot(0, self.subwindow.adjustSize)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
Pete
More information about the PyQt
mailing list