2016-07-01 10 views
0

Ich möchte meinen Code verbessern, aber derzeit habe ich nicht viel Ahnung, wie. Also habe ich Qt Designer verwendet und ein Hauptfenster plus 3 Dialoge erstellt, die vom Hauptfenster aus geöffnet werden können. Konvertierte .ui-Dateien in .py-Dateien und erstellte die MainWindow-Klasse, die alle verwaltet. Alles funktioniert gut, aber für mich sieht falsch:Pyside + Qt Designer Bessere Codierung

class MainWindow(QMainWindow, Ui_MainWindow): 
    # init and else 
    [...] 

    def open_add_dialog(self): 
     self.dialog = AddDialog() 
     self.dialog.show() 

    def open_edit_dialog(self): 
     self.dialog = EditDialog() 
     self.dialog.show() 

    def open_about_dialog(self): 
     self.dialog = AboutDialog() 
     self.dialog.show() 

    def assign_widgets(self): 
     self.actionAdd.triggered.connect(self.open_add_dialog) 
     self.actionEdit.triggered.connect(self.open_edit_dialog) 
     self.actionAbout.triggered.connect(self.open_about_dialog) 

-Code vereinfacht .. So wie Sie sehen, ich habe drei fast gleich Methoden. Es stellt sich mir die Frage, ob es möglich ist, alles zu einem Ganzen zusammenzufassen? Was ich will, so etwas wie dieses:

def open_dialog(self): 
    sender = self.sender() 
    sender.show() 

Antwort

1

Ich denke, man sollte nie die sender Methode von Qt verwenden, da es von einer anderen Funktion unmöglich Aufruf der Methode macht, können Sie dann verwenden sie nur über das Signal/Slot-Mechanismus. Es heißt daher in the documentation, dass: "Diese Funktion verletzt das objektorientierte Prinzip der Modularität". Die Verwendung während des Debuggens ist natürlich in Ordnung.

In Ihrem Fall sind die Methoden ziemlich klein. Sie können lambdas in der connect-Anweisung verwenden, damit Sie keine separaten Methoden erstellen müssen. Oder Sie könnten die Dialoge im Konstruktor erstellen und nur mit den Methoden show verbinden. So:

class MainWindow(QMainWindow, Ui_MainWindow): 

    def __init__(self): 
     self.add_dialog = AddDialog() 
     self.edit_dialog = EditDialog() 
     self.about_dialog = AboutDialog() 

    def assign_widgets(self): 
     self.actionAdd.triggered.connect(self.add_dialog.show) 
     self.actionEdit.triggered.connect(self.edit_dialog.show) 
     self.actionAbout.triggered.connect(self.about_dialog.show)