Aktualisierung zwischen QtWidgets

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
matze.dev
User
Beiträge: 1
Registriert: Mittwoch 6. Januar 2021, 15:13

Hallo zusammen,

ich habe eine Frage zum Stil. Es geht um die Aktualisierung einer QComboBox wenn sich an anderer Stelle eine QTableView bzw. dessen Model sich ändert.

Aktuell übergebe ich den Controller (A) mit der QComboBox und der Methode zur Initalisierung an den Controller (B) mit der QTableView.

Wenn sich die Daten im Model ändern (onclick btn_save) dann wird "init_combo_box" aufgerufen und das item_model als auch die QComboBox neu inialisiert und aktualisiert.

Das funktioniert soweit auch... ich finde nur das erzeugt eine recht enge Kopplung. Gibt es hier andere Techniken um zwischen den Controller zu kommunizieren für eine Aktualisierung der QWidgets um so eine lose Kopplung zu erzeugen? Ich bin noch recht neu im PyQt-Umfeld. Meine bisherigen Schwerpunkte waren ehr WebDevelopment und da war ich mit den EventHandlern immer ganz Happy... bei PyQt sehe ich da noch nicht ganz so durch.

Hier ein vereinfachtes Code-Beispiel:

Code: Alles auswählen

class AController:

    def __init__(self, combo_box):
        self.combo_box = combo_box
        self.init_combo_box()

    def init_combo_box(self):

        item_model = QtGui.QStandardItemModel()

        list = repository.select_combo_box_list()

        for item in list:
            item = QtGui.QStandardItem(list[0])
            item.setData(list[1])
            item_model.appendRow(item)

        del combo_box_list

        self.combo_box.setModel(item_model)

class BController:

    def __init__(self, table_view, btn_save, controller_a):
        self.table_view = table_view
        self.btn_save = btn_save
        self.model = QSqlRelationalTableModel()
        self.controller_a = controller_a
        
    """
    Init Tableview (QSqlRelationalTableModel, setEditStrategy = OnManualSubmit)
    """
    
    def on_click_save_button(self):
        self.model.submitAll()
        self.controller_a.init_combo_box()
        
Für Hinweis und Anmerkungen bedanke ich mich im Voraus.

Viele Grüße
Matze
Benutzeravatar
__blackjack__
User
Beiträge: 13007
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@matze.dev: `init_combo_box()` greift auf ein magisches `repository` zu. Sollte das kein Modul sein, wäre das eine globale Variable.

`list` ist der Name eines eingebauten Datentyps, den sollte man nicht an etwas anderes binden.

Die Schleifenvariable heisst `item` und *in* der Schleife wird der Name dann für etwas anderes verwendet. Auf den Wert der Schleifenvariable wird gar nicht zugegriffen, dafür explizit in jedem Schleifendurchlauf per harz kodierten Indexwerten auf die ersten beiden Elemente von `list`. Das macht keinen Sinn. Sollte da eigentlich `item` gemeint sein, überschneidet sich das wie gesagt mit den beiden Verwendungen von `item` so dass `item[0]` die Schleifenvariable meint und `item[1]` dann als Index in ein `QStandardItem`-Objekt benutzt wird, was nicht funktionieren dürfte.

Sollte das Ergebnis von `select_combo_box_list()` Wertepaare enthalten, würde man die Bestandteile gleich in der Schleife an sprechende Namen binden statt magische Indexwerte zu verwenden.

`combo_box_list` ist undefiniert, aber ein ``del`` auf einen Namen macht hier sowieso keinen Sinn und deutet auf ein Missverständnis hin was ``del`` auf Namen macht: den *Namen* löschen. *Nicht* das Objekt. Objekte kann man nicht selbst löschen. Und der Name verschwindet am Ende des Ablaufs der Funktion von alleine.

Du könntest zumindest das Model wiederverwenden, statt ein neues zu erstellen. `clear()` und dann neu füllen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten