QStackWidget - wie updaten?

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
GiJay
User
Beiträge: 36
Registriert: Freitag 5. März 2021, 14:40
Wohnort: Ratingen
Kontaktdaten:

In einem SubWindow wird diese Code ausgeführt:

Code: Alles auswählen

  def __init__(self):
        super(SubwindowKontakt, self).__init__()
        #
        #MainWindow.main_space.status_bar.showMessage("Kontakte verwalten", 0)

        #db checken und öffnen
        self.open_db()
        #
        self.model = QSqlTableModel(db=self.db)
        self.model.setTable("kunde")
        self.model.setEditStrategy(QSqlTableModel.EditStrategy.OnManualSubmit)
        #self.model.select()
        #
        self.mapper = QDataWidgetMapper(self)
        #self.mapper.setModel(self.model)
        #
        self.setWindowTitle("Kontakt")
        self.leftlist = QListWidget()
        self.leftlist.setFixedWidth(150)
        self.leftlist.setStyleSheet('color: rgb{}'.format(str(textcolor_k)) + '; font-size: 15px; font-weight: bold;')

        self.leftlist.insertItem(0, 'Suche: Name+Tel')
        self.leftlist.insertItem(1, 'Gesamtliste')
        self.leftlist.insertItem(2, 'Neuer Kontakt')

        self.stack_suche_n_t = QWidget()
        self.stack_liste = QWidget()
        self.stack_kontakt = QWidget()

        self.stack_GUI_suche_n_t()
        self.stack_GUI_liste()
        self.stack_GUI_kontakt()

        self.Stack = QStackedWidget(self)
        self.Stack.addWidget(self.stack_suche_n_t)
        self.Stack.addWidget(self.stack_liste)
        self.Stack.addWidget(self.stack_kontakt)

        self.hbox = QHBoxLayout(self)
        self.hbox.addWidget(self.leftlist)
        self.hbox.addWidget(self.Stack)

        self.setLayout(self.hbox)
        self.leftlist.currentRowChanged.connect(self.display)
        
Nun habe ich ein Fenster in denen ich ich 3 Widgets "(1)Suche, (2)Liste und (3)Kontakt" auswählen kann. Unter (2)Liste kann ich mir alle (3)Kontakte anzeigen lassen. Das funktioniert auch alles .

Mein Problem: Ändere ich in (3)Kontakt ein paar Daten, werden diese in der (2)Liste erst angezeigt, wenn ich das ganze StackWidget schließe und neu aufrufe.
Im ganzen StackWidget werden bei alle 3 Widgets die Daten angezeigt. die beim Start des Codes vorhanden waren.

Gibt es einen Weg, die Daten während der Laufzeit zu aktualisieren?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wie wird denn stack_iste befuellt? Den Code zeigst du ja nicht.
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Randbemerkung: Das sieht ein bisschen komisch aus, das da erst drei `QWidget`-Objekte an das Objekt gebunden werden und dann drei Methodenaufrufe folgen die wahrscheinlich diese Widgets mit Inhalt füllen. Da würde man eher das jeweilige `QWidget` in dieser Methode erzeugen, füllen, und dann als Rückgabewert liefern. Und den Methoden auch Methodennamen geben: Funktions- und Methodennamen beschreiben normalerweise die Tätigkeit die sie durchführen.

So Informationen wie `left` oder `stack` gehören auch nicht wirklich in Namen. Es ist nicht interessant wo ein Widget angezeigt wird, weder räumlich, noch in was für einem Containerwidget, sondern was der Inhalt bedeutet.

Beim CSS ist komisch einen Teil mit `format()` zu erledigen und daran dann direkt weiteren konstanten Text mit ``+`` dran zu pappen. Das hätte *eine* Vorlage sein können. Und auch mit f-Zeichenkette, statt `format()`. Und der `str()`-Aufruf in der Zeile ist redundant, denn das macht das formatieren in eine Zeichenkette ja automatisch, den Wert in eine Zeichenkette zu wandeln.

Last but not least: Pixelgenaue Breiten vorgeben ist nicht gut bis falsch.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
GiJay
User
Beiträge: 36
Registriert: Freitag 5. März 2021, 14:40
Wohnort: Ratingen
Kontaktdaten:

So wird das Stackfenster für die Liste erstellt:

Code: Alles auswählen

  # Fenster rechte Seite - LISTE
    def stack_GUI_liste(self):
        #
        main_layout = QVBoxLayout()
        self.font_color = 'blue'
        #
        pic_kn = QPixmap(PIC + "Tick_kn.png")
        picItemAktivK = QTableWidgetItem(QIcon(pic_kn), "")
        pic_km = QPixmap(PIC + "Tick_km.png")
        picItemMakerK = QTableWidgetItem(QIcon(pic_km), "")
        # 1
        headline_l = QLabel("Kontakt 'Liste'")
        headline_l.setStyleSheet('color: rgb{}'.format(str(textcolor_k)) + '; font-size: 15px; font-weight: bold;')
        main_layout.addWidget(headline_l, alignment=Qt.AlignmentFlag.AlignTop)
        headline_l.setFixedHeight(30)
        # 2
        self.tab_view = QTableWidget()
        self.tab_view.setColumnCount(8)

        # ganze Zeile auswählen
        self.tab_view.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows)
        #
        ###self.model.setEditStrategy(QSqlTableModel.OnFieldChange)
        self.tab_view.setHorizontalHeaderLabels(["KD-Nr.", "Anrede", "Titel", "Vorname", "Nachname", "Stadt", "Aktiv", "Maker"])
        #self.tab_view.clearContents()
        query = QSqlQuery("SELECT dbkKDNr, dbkAnrede, dbkTitel, dbkVorname, dbkNachname, dbkStadt, dbkaktiv, dbkMaker FROM kunde")
        while query.next():
            rows = self.tab_view.rowCount()
            self.tab_view.setRowCount(rows + 1)
            self.tab_view.setItem(rows, 0, QTableWidgetItem(str(query.value(0))))
            self.tab_view.setItem(rows, 1, QTableWidgetItem(query.value(1)))
            self.tab_view.setItem(rows, 2, QTableWidgetItem(query.value(2)))
            self.tab_view.setItem(rows, 3, QTableWidgetItem(query.value(3)))
            self.tab_view.setItem(rows, 4, QTableWidgetItem(query.value(4)))
            self.tab_view.setItem(rows, 5, QTableWidgetItem(query.value(5)))
            if bool(query.value(6)) == True:
                self.tab_view.setItem(rows, 6, QTableWidgetItem(picItemAktivK))
            if bool(query.value(7)) == True:
                self.tab_view.setItem(rows, 7, QTableWidgetItem(picItemMakerK))
        self.tab_view.resizeColumnsToContents()
        #
        ##
        main_layout.addWidget(self.tab_view)
        self.stack_liste.setLayout(main_layout)
        # DoppelClick: gewählten Eintrag aktivieren
        self.tab_view.doubleClicked.connect(self.item_number)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja, da hast du ja dein Problem. Du befuellst die Widgets mit statischen Daten. Statt auch hier ein Modell zu benutzen. Also wird da auch nix magisch geupdatet.
GiJay
User
Beiträge: 36
Registriert: Freitag 5. März 2021, 14:40
Wohnort: Ratingen
Kontaktdaten:

Vielen Dank, dass Du mal drauf geschaut hast. Habe nun eine Model, aber so geht es auch nicht oder habe ich Dich falsch verstanden? Erzeuge ich im "Stack-Window 1" einen neuen Eintrag und möchte dann im "Stack-Window 2" die gesamte Eintragsliste sehen, ist dieser Eintrag nicht aufgeführt. Erst wenn ich den kompletten "Stack" schließe und wieder aufrufe, ist der Eintrag da.

Code: Alles auswählen

 def stack_GUI_liste(self):
        #
        main_layout = QVBoxLayout()
        self.font_color = 'blue'
        #
        pic_kn = QPixmap(PIC + "Tick_kn.png")
        picItemAktivK = QTableWidgetItem(QIcon(pic_kn), "")
        pic_km = QPixmap(PIC + "Tick_km.png")
        picItemMakerK = QTableWidgetItem(QIcon(pic_km), "")
        # 1
        headline_l = QLabel("Kontakt 'Liste'")
        headline_l.setStyleSheet('color: rgb{}'.format(str(textcolor_k)) + '; font-size: 15px; font-weight: bold;')
        main_layout.addWidget(headline_l, alignment=Qt.AlignmentFlag.AlignTop)
        headline_l.setFixedHeight(30)
        # 2
        self.k_db_open()
        self.k_db_init()

	""" NEU """

        self.k_list = QSqlTableModel()
        self.tab_view = QTableView()
        if self.tab_view.isEnabled():
            self.k_list.setQuery(
                "SELECT dbkKDNr, dbkAnrede, dbkTitel, dbkVorname, dbkNachname, dbkStadt, dbkaktiv, dbkMaker FROM kunde")
            self.tab_view.setModel(self.k_list)

        """ ALT
        self.tab_view.setColumnCount(8)
        # ganze Zeile auswählen
        self.tab_view.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows)
        #
        self.tab_view.setHorizontalHeaderLabels(["KD-Nr.", "Anrede", "Titel", "Vorname", "Nachname", "Stadt", "Aktiv", "Maker"])
        query = QSqlQuery("SELECT dbkKDNr, dbkAnrede, dbkTitel, dbkVorname, dbkNachname, dbkStadt, dbkaktiv, dbkMaker FROM kunde")
        while query.next():
            rows = self.tab_view.rowCount()
            self.tab_view.setRowCount(rows + 1)
            # Testweise
            # print("Rows: " + str(rows))
            self.tab_view.setItem(rows, 0, QTableWidgetItem(str(query.value(0))))
            self.tab_view.setItem(rows, 1, QTableWidgetItem(query.value(1)))
            self.tab_view.setItem(rows, 2, QTableWidgetItem(query.value(2)))
            self.tab_view.setItem(rows, 3, QTableWidgetItem(query.value(3)))
            self.tab_view.setItem(rows, 4, QTableWidgetItem(query.value(4)))
            self.tab_view.setItem(rows, 5, QTableWidgetItem(query.value(5)))
            if bool(query.value(6)) == True:
                self.tab_view.setItem(rows, 6, QTableWidgetItem(picItemAktivK))
            if bool(query.value(7)) == True:
                self.tab_view.setItem(rows, 7, QTableWidgetItem(picItemMakerK))
            self.tab_view.resizeColumnsToContents()
        """

        self.close_db()

        ##
        main_layout.addWidget(self.tab_view)
        self.stack_liste.setLayout(main_layout)
        # DoppelClick: gewählten Eintrag aktivieren
        self.tab_view.doubleClicked.connect(self.item_number)
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@GiJay: Du musst überall das gleiche Model verwenden. Das ist ja gerade die Idee, das man für ein Model verschiedene Darstellungsarten haben kann.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
GiJay
User
Beiträge: 36
Registriert: Freitag 5. März 2021, 14:40
Wohnort: Ratingen
Kontaktdaten:

Funzt aber leider auch nicht ...

Code: Alles auswählen

self.tab_view = QTableView()
self.model.setQuery(
                "SELECT dbkKDNr, dbkAnrede, dbkTitel, dbkVorname, dbkNachname, dbkStadt, dbkaktiv, dbkMaker FROM kunde")
self.tab_view.setModel(self.model)
Der neuste Eintrag wird erst ergänzt, wenn ich das gesamte Subwindow schließe und wieder neu aufrufe. Solange das bestehende Fenster nicht geschlossen wird, updated sich auch nicht das Model ....
GiJay
User
Beiträge: 36
Registriert: Freitag 5. März 2021, 14:40
Wohnort: Ratingen
Kontaktdaten:

Habe es umgeschrieben und nun funzt es. Habe mir noch eine Spaltensortierung gegönnt. Der Hinweis mit dem "Model" hat die alten Zellen im Kopf noch einmal in Aufruhr gebracht und hat etwas gebracht. Merci.

Code: Alles auswählen

  
 def stack_GUI_liste(self):
        print("    5 def stack_GUI_liste / IN")
        main_layout = QVBoxLayout()
        self.font_color = 'blue'
        #
        pic_kn = QPixmap(PIC + "Tick_kn.png")
        picItemAktivK = QTableWidgetItem(QIcon(pic_kn), "")
        pic_km = QPixmap(PIC + "Tick_km.png")
        picItemMakerK = QTableWidgetItem(QIcon(pic_km), "")
        # 1
        headline_l = QLabel("Kontakt 'Liste'")
        headline_l.setStyleSheet('color: rgb{}'.format(str(textcolor_k)) + '; font-size: 18px; font-weight: bold;')
        main_layout.addWidget(headline_l, alignment=Qt.AlignmentFlag.AlignTop)
        headline_l.setFixedHeight(30)
        # 2
        self.q_model = QSqlQueryModel()
        #
        self.view = QTableView()
        self.view.setModel(self.q_model)
        self.view.setSortingEnabled(True)
        self.view.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows)  # ganze Zeile durch click auswählen
        self.view.horizontalHeader().setDefaultAlignment(Qt.AlignmentFlag.AlignCenter)  # Überschrift mittig
        self.view.horizontalHeader().setStyleSheet('color: rgb{}'.format(str(textcolor_k))) # Überschrift Farbe "Kunde"
        ############################
        #self.view.

        ##
        self.s_model = QSortFilterProxyModel()
        self.s_model.setSourceModel(self.q_model)
        self.view.setModel(self.s_model)
        # 3
        main_layout.addWidget(self.view)
        self.stack_liste.setLayout(main_layout)
        # DoppelClick: gewählten Eintrag aktivieren
        self.view.doubleClicked.connect(self.item_number)
        print("    5 def stack_GUI_liste / OUT")
Musste jedoch von QTableWidget auf QTableView ändern und da ist die Formatierung von Zeilen und Zellen leider nicht so simpel wie beim QTableWidget.
Antworten