C++ hat normalerweise keinen Aufräummechanismus ala garbage collector oder reference counter (schon wieder englisch, die englischen Begriffe sind in der Programmierdomäne eindeutig belegt, ins Deutsche übertragen, müsste man erst erklären, was gemeint ist). Darum haben die Qt-Leute Sicherheitsnetze eingebaut: 1. über den Objektbaum, welcher mit parent-child-Beziehungen aufgebaut wird. Darüber kann Qt die Objekte ordentlich abräumen (also in der richtigen Reihenfolge children --> parent). Werden QObjects ohne parent erstellt, werden diese spätestens von QApplication abgeräumt (2. Variante, ist u.a. der Grund, warum es ein QApplication-Objekt vor der Benutzung anderer QObjects geben muss).
Beim QWorkspace wirds schwieriger. Die Doku zu `addWindow` gibt indirekt den Hinweis, dass die Elternschaft sich ändert. Was genau passiert, sieht man erst, wenn man den Sourcecode von `addWindow` anschaut: es wird ein Proxyobjekt vom Typen QWorkspaceChild erstellt und das Subfenster dort reingehängt (Objektbaum: QWorkspace->QWorkspaceChild->Subwidget). Diese Verschleierung war offensichtlich selbst den Qt-Leuten zuviel und sie haben QWorkspace fallen gelassen und durch MdiArea ersetzt. Schaut man sich die Schnittstellen beider Klassen an, so unterscheiden sie sich hauptsächlich dadurch, dass MdiArea das vorher undurchsichtige Verhalten durch die Spezifikation von QMdiSubWindow offen legt und Benutzern Kontrolle zurück gibt.
Nun zur Frage `close`:
close macht genau nur das - es schliesst das Fenster. Kurzer Gegencheck:
Code: Alles auswählen
from PyQt4 import QtGui
def showQWidgetsChildren(qobj):
def wrapped():
for obj in qobj.children():
if isinstance(obj, QtGui.QWidget):
obj.show()
return wrapped
app = QtGui.QApplication([])
win = QtGui.QWorkspace()
but = QtGui.QPushButton(win)
but.clicked.connect(showQWidgetsChildren(win))
win.addWindow(QtGui.QWidget())
win.show()
app.exec_()
Du fragst Dich wahrscheinlich, warum das für Dich wichtig ist. Mit MDI kannst Du prinziell unendlich Fenster öffnen und schliessen. Machst Du knappe Ressourcen alter Fenster nicht frei, laufen diese voll (z.B. Speicher) oder blockieren (z.B. offene Datei im Subfenster unter Windows). Das gilt übrigens für alle QWidgets, nicht nur innerhalb QWorkspace. Daher sollte man abwägen, ob ein Fenster wiederbenutzbar ist (neue Daten in Widgets laden + show) oder das Fenster beim Schliessen zerstören und bei Bedarf neu erstellen.