Hallo jerch,
irgendwie verstehe ich dich besser als bei Blackjack. Ich möchte seine Fähigkeiten bezüglich der Pythonprogrammierung
nicht in Frage stellen, aber in Puncto Erklärung bleibe ich bei BlackJacks Erklärung immer auf der Strecke. Daher möchte ich dir für deine Geduld danken

Nun gehen wir mal deine Anmerkungen Stück für Stück durch.
jerch hat geschrieben:
Beide Funktionen übernehmen Konstruktoraufgaben und sind nicht voneinander abhängig. Man könnte die Blöcke daher auch in __init__ packen. Als Subaufruf innerhalb der jeweils anderen macht keinen Sinn - es verschleiert die Unabhängigkeit und macht die Nachvollziehbarkeit des Kontrollflusses unnötigerweise anstrengender. Eine Funktion/Methode sollte eine Funktionseinheit sein, wenn Du z.B. createToolBar in createMenuBar aufrufst, wäre der Name für letzteres "falsch" - die Methode müsste dann eigentlich createMenuAndToolBar heissen.
Hier muss ich dich mal ganz naiv fragen: Was meinst du mit "pack die Methoden in die __init__? Du meinst bestimmt in def __init__(self, parent=None):? Und wie "packt" man dort eine Methode/Funktion rein?
jerch hat geschrieben:
Nun zu Deinem Design/Code:
Ich würde die Menü- und Toolbarsache eher im MainWindow halten und die Qt-Standardklassen dafür verwenden. Dann ist das sehr hübsch über den Designer realisierbar ohne viel Quellcode. Was können Deine Kindklassen denn mehr, das Dir am Qt-Portfolio fehlte?
Ich möchte erst einmal versuchen Benutzeroberflächen von Hand zu schreiben, und QT-Designer vorerst aus dem Weg gehen. Und weshalb ich die MenuBar ausgelagert habe und nicht im MainWindow halte? Nun, die MenuBar nimmt an MenuItems zu, und ich will nicht, dass allein durch die MenuBar der Quelltext im MainWindow unendlich lang wird. Im Modul MDI_Menu.py sind schon rund 230 Zeilen an Code. Und dabei ist die MenuBar nach meinen Vorstellungen noch nicht komplett. Und wenn ich das alles im MainWindow halten würde, wäre es ganz schön unübersichtlich.
jerch hat geschrieben:
In Zeile 64 und 65 bindest Du Exemplare von MyForm und dem umgebenden SubWindow an Attribute. Da Du im gezeigten Code sonst nichts weiter damit in anderen Methoden machst, brauchst Du die nicht, da sich Qt darum kümmert.
Diese Zeilen hast du angesprochen. Wer sind Exemplare von MyForm?
Code: Alles auswählen
[...]
self.w = MyForm(self)
self.SuWindow = self.centralWidget().addSubWindow(self.w)
[...]
Und mit Attribute meinst du in diesem Fall diese Zeile (setAttribute)? Und diese Zeile kann ich komplett löschen? Ich dachte, nur so kann und soll ich den Flag setzen, damit aufgeräumt und Resourcen freigegeben werden.
jerch hat geschrieben:
Ohne Qt musst Du sie objektweit binden, sonst räumt Python das Objekt auf. Dann solltest Du aber einen Containertypen nutzen, um alle Referenzen zu merken. So wie Du es jetzt umgesetzt hast, sind mit einem neuen Subfenster die Referenzen (und ohne Qt auch die Objekte) älterer noch offener Subfenster weg.
Zwei Fragen: Was meinst du mit "ohne Qt"? Ich importiere eingangs Qt (from PyQt4.QtCore import Qt). Containertypen? Kannst du mir mal bitte ein kleines Pseudocode als Beispiel präsentieren, was du damit meinst?
jerch hat geschrieben:
Zeile 67 + 70-73:
Arrgh! Bitte überleg Dir mal, was Du da machst. Was ich lese: "Ein Button auf w ruft `closeActive` auf, welches das derzeit aktive Fenster der MdiArea schliesst." Wolltest Du das? Oder eher das eigene Subfenster schliessen? Falls letzteres - da ist zuviel Magie drin. Was passiert beim Klicken eines Buttons wohl mit dem Fokus der Subfenster? Ändert der sich? Vor oder nach Singal/Slot-Verarbeitung? Ist das verlässlich?
Mir ist dieser Button eh schleierhaft - wofür brauchst Du den? Die Subfenster bringen doch alles dafür mit.
Du hast Recht, ich will das eigene SubWindow schließen. Und ich habe die Angelegenheit wie folgt gelöst:
Code: Alles auswählen
[...]
def createNew(self):
if self.existUnterfenster(self.Dict_Language.Dict_TestDialog["Title"]):
reply = QMessageBox.critical(self, (self.Dict_Language.Dict_Message_WindowExists["MessageTitle"]),
self.Dict_Language.Dict_Message_WindowExists["MessageText"])
print "MessageBox wurde ausgegeben."
else:
self.w = MyForm(self)
self.SuWindow = self.centralWidget().addSubWindow(self.w)
self.w.setAttribute(Qt.WA_DeleteOnClose)
self.w.BClose.clicked.connect(self.closeSubWindow)
self.w.show()
def closeSubWindow(self):
self.SuWindow.close()
[...]
Wozu ich den Schließ-Button brauche? Ich weiß, in der Titelleiste eines jeden QWidgets und QDialoges kann man auf einen tollen X drücken. Aber ich möchte, dass der Anwender auch über einen Button das Fenster schließen kann. Mir ist schleierhaft, weshalb es dir schleierhaft sei? Es gibt sehr viele Anwendungen, die eben genauso arbeiten. Und außerdem denke ich ja auch schon einen Schritt weiter. Da es eine Datenbank-Anwendung werden soll, so sollen im Anschluss auf dem Klick "Speichern" die Datensätze in die Datenbank und das Fenster geschlossen werden und eine MessageBox ausgegeben werden, wo dann in Etwa steht "Erfolgreich gespeichert". Aber verlegen wir die Geschmacksfrage erstmal nach hinten.