Seltsames Verhalten von QDockWidgets

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Rekrul
User
Beiträge: 78
Registriert: Dienstag 7. Dezember 2010, 16:23

Hallo liebes Python-Forum,

ich habe eine Frage bezüglich QDockWidgets:

Ich habe eine Anwendung in der Projekte angelegt werden können, die mehrere Diagramme in Form von QDockWidgets in einem QMainWindow darstellen. Beim Erstellen / Laden eines Projektes geschieht folgendes. DockPlot ist dabei eine eigene Klasse die von QDockWidget erbt und Diagramme darstellt und self ist die Klasse die von QMainWindow erbt.:

Code: Alles auswählen

    for diagram in PM.current_project.diagrams:
        self.dock_plot[diagram.name] = DockPlot(self, diagram)
        self.dock_plot[diagram.name].setWindowTitle(diagram.name)        
        self.addDockWidget(0x4, self.dock_plot[diagram.name])
Beim Schließen eines Projektes wird folgendes Code-Fragment ausgeführt:

Code: Alles auswählen

    for key in self.dock_plot:
         self.removeDockWidget(self.dock_plot[key])
         self.dock_plot[key].close()
         self.dock_plot[key].destroy()
Beim Speichern eines Projektes wird auch der Status der QDockWidgets gespeichert um sie anschließend beim Laden wieder korrekt darstellen zu können.

Code: Alles auswählen

    state = self.saveState()
    geo_file = open('geometry', 'wb')
    geo_file.write(state)
    geo_file.close() 

Und zu guter Letzt das Laden eines Projektes:

Code: Alles auswählen

    for diagram in PM.current_project.diagrams:
        self.dock_plot[diagram.name] = DockPlot(self, diagram)
        self.dock_plot[diagram.name].setWindowTitle(diagram.name)        
        self.addDockWidget(0x4, self.dock_plot[diagram.name])
        
    geo_file = open(os.path.join(PM.current_projekt.workspace, 'geometry'), 'rb')
    state = geo_file.read()
    geo_file.close()
    self.restoreState(state)      
Das Erstellen und Speichern funktioniert einwandfrei. Wenn kein Projekt geladen ist funktioniert auch das Laden. Ist allerdings ein Projekt geladen und ich ein anderes Projekt, oder dasselbe, öfnnen möchte werden alle QDockWidgets doppelt angezeigt. Verzichte ich auf das Wiederherstellen der einzelnen Status für die QDockWidgets tritt dieses Phänomen nicht auf.

Auch dies funktioniert beim Schließen eines Projektes nicht:

Code: Alles auswählen

    for dockwidget in self.findChildren(QtGui.QDockWidget):
        self.removeDockWidget(dockwidget)
        dockwidget.close()
        dockwidget.destroy()
Zwar findet er alle DockWidgets und führt diesen Code aus, aber wenn ich mir dannach mit print alle QDockWidgets ausgeben lasse, dann sind sie noch da und werden auch noch gezeigt. :K

Hat jemand zufälligerweise schonmal ein ähnliches Problem gehabt, oder weiss wo ich einen Fehler habe? Hoffe es kann jemand helfen. Sollten noch weitere Informationen von Nutzen sein, dann lasst es mich wissen.

Gruß,
Rekrul
  • Python v. 2.6.6
  • PyQt4 v. 4.7.7
lunar

Das Übliche: Zeige bitte einen minimalen, ausführbaren Quelltext, mit dem man das Problem nachvollziehen kann, und nicht lediglich irgendwelche Ausschnitte aus Deinem Quelltext, die Du zwar für wichtig hältst, die aber letztlich nichts über das Problem aussagen.
Rekrul
User
Beiträge: 78
Registriert: Dienstag 7. Dezember 2010, 16:23

Hallo,

ich habe ein kleines minimalistisches und ausführbares Programm geschrieben. Und siehe da: es funktioniert. :?

Das Problem muss also IRGENWO anders liegen, aber ich habe leider keine Ahnung wo. Meinen vollständigen Code hier zu posten wäre Quatsch, aber vielleicht hilft folgende Frage ja weiter: Was muss ich falsch gemacht haben, wenn durch den Aufruf

Code: Alles auswählen

 mainwindow.removeDockwidget(dockwidget) 
das Dockwiget immer noch mit

Code: Alles auswählen

mainwindow.findChildren(QtGui.QDockWidget)
zu finden ist?

Ich habe schon geschaut, ob es vielleicht mehrfach in mainwindow.children() vorhanden ist. Ist es aber nicht ...

Gruß,

Rekrul
lunar

Du machst gar nichts falsch, Du hast nur die Dokumentation nicht gelesen. ".removeDockWidget()" entfernt das Andockfenster lediglich aus dem Layout des Hauptfensters und blendet es aus. Das Andockfenster selbst aber wird nicht gelöscht, und folglich auch nach dem Aufruf von ".removeDockWidget()" noch immer seinen Platz im Objektbaum ein.
Rekrul
User
Beiträge: 78
Registriert: Dienstag 7. Dezember 2010, 16:23

Mal wieder einen Dank für den Hinweis. QDockWidget.deleteLater() scheint das Problem zu lösen.
Antworten