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.
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: 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.
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: 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?
Diese Zeilen hast du angesprochen. Wer sind Exemplare von MyForm?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.
Code: Alles auswählen
[...]
self.w = MyForm(self)
self.SuWindow = self.centralWidget().addSubWindow(self.w)
[...]
Code: Alles auswählen
self.w.setAttribute(Qt.WA_DeleteOnClose)
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: 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.
Du hast Recht, ich will das eigene SubWindow schließen. Und ich habe die Angelegenheit wie folgt gelöst: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.
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()
[...]