Nach aktualiserung von Qtablewidget werden alte Werte geladen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Benutzeravatar
nieselfriem
User
Beiträge: 93
Registriert: Sonntag 13. Januar 2013, 16:00

Montag 25. Februar 2019, 18:33

Hallo!

Ich habe folgendes Problem. Nach dem löschen einer Zeile im Qtablewidget, wird dieses zwar optisch aktualisiert, es werden jedoch die alten Werte beim auswählen der neuen ersten Zeile geladen.

Ich lade die Daten wie folgt ins Widget.
1. ich ziehe mir die Daten aus der Datenbank in Form einer zweidimensionalen Liste
2. diese Liste wird dann mit einer Doppelten Schleife in die Tabelle gerendert.

Beim Start der Anwendung wird die Methode render_customer_table() die Tabelle erstellt

Code: Alles auswählen

    def render_customer_table(self):
        """
        Wird von InitApplication in init_abu_mainwindow aufgerufen
        Übernimmt die Daten von load_customer_data() im Format
        [[KundenId , AddressId , Nachname, Vorname, Strasse , PLZ , Ort,
        Land, Addresszusatz, Staat, Telefon, Email]]
        :return:
        """

        customer_list = self.load_customer_data()
        self.__customer_table.clearContents()
        self.__customer_table.setRowCount(0)
        self.__customer_table.clear()
        self.__customer_table.clearSelection()
        print("Rowcount: {0}: ".format(self.__customer_table.rowCount()))
        print("Customerlist vor dem Einfuegen in Tabelle:")
        print(customer_list)
        if customer_list:
            self.__customer_table.setRowCount(len(customer_list))
            for i in range(len(customer_list)):
                self.__customer_data.append(customer_list[i][0:12])
            for row, entry in enumerate(customer_list):
                for col, item in enumerate(entry[2:12]):  # Ohne KundenId und AddressId
                    self.__customer_table.setItem(row, col, QtWidgets.QTableWidgetItem(item))
diese bezieht die Daten von der Funktion load_customer_data() welche durch eine Datenbankoperation mittels dem Pony ORM die Daten bezieht

Code: Alles auswählen

 def load_customer_data(self):
        """
        Ueber die Datenbankscnittstelle DatabaseOperations werden alle Kundendaten
        ueber die Funktion get_costumer_list als Liste ermittelt
        :return:customer_list Kundendatenliste
        """
        do = DatabaseOperations()
        customer_list = do.get_costumer_list()
        return customer_list
get_costumer_list()

Code: Alles auswählen

    def get_costumer_list(self, order_key=""):
        """
        Fuert Selects mit einem Joins auf die Tabellen Kunde und Adresse um diese in einer Liste
        fuer Kundendaten in der Grundansicht des progrmmes zu liefern
        :param order_key:
        :return: List of customerdatas[KundenId , AddressId , Nachname, Vorname, Strasse 8, PLZ , Ort,
        Land, Addresszusatz, Staat, Telefon, Email]
        """
        if platform.system() == "darwin":
            locale.setlocale(locale.LC_ALL, 'de_DE')
        else:
            locale.setlocale(locale.LC_ALL, '')
        customer_table_list = []
        with db_session:
            if order_key == "":
                sel = select((k.kuId, a.adressid, k.nachname, k.vorname, k.email, k.telefon, a.kunde, a.ort, a.strasse,
                              a.plz, a.land, a.adresszusatz,
                              a.staat, a.art) for a in Adresse for k in Kunde if k.kuId == a.kunde.kuId and a.art == 1
                             ).order_by(lambda: k.nachname)
            elif order_key == "vorname":
                sel = select((k.kuId, a.adressid, k.nachname, k.vorname, k.email, k.telefon, a.kunde, a.ort, a.strasse,
                              a.plz, a.land, a.adresszusatz,
                              a.staat, a.art) for a in Adresse for k in Kunde if k.kuId == a.kunde.kuId and a.art == 1
                             ).order_by(lambda: k.vorname)

            for select_in in sel:
                customer_table_list.append(
                    [select_in[0], select_in[1], select_in[2], select_in[3], select_in[8], select_in[9],
                     select_in[7], select_in[10], select_in[11], select_in[12], select_in[5], select_in[4]])

            # print(ku_table_list)
            # sel.show()
            print(customer_table_list)
            return customer_table_list
Nun zu meinem Problem. Ich habe eine Funktion gebaut, mit der ich die mir ein Kunden aus der Tabelle auswähle und diesen aus der Datenbank lösche

Code: Alles auswählen

    def delete_customer(self):
        ret = self.__msbx.info_box("Soll Kunde wirklich gelöscht werden?", "YESNO",
                                   "Hinweis: Kunde löschen")
        if ret == QMessageBox.Yes:
            do = DatabaseOperations()
            dpop_return = do.delete_customer(self.__customer_number)
            if dpop_return != 0:
                self.__msbx.showDatabeErrorMsgBx(dpop_return)
            else:
                self.__msbx.showMessageDataDeletedMsgBx()
        self.render_customer_table()#Tabelle mit den aktualierten Datenbankeinträgen neu rendern
Das löschen funktioniert auch ganz gut. Das bedeutet, der Kunde wird aus der Datenbank gelöscht, die Tabelle wird sichtbar aktualisiert. Die Zeile des gewünschten Kunden ist weg.Jedoch wenn ich den nachgerückten neuen ersten Kunden in der Zeile 1 anklicke, werden noch die alten, vom vorher gelöschten Kunden geladen. (siehe Textfelder links) Das heißt, bei der Auswahl der Zeile werden auch die alten Daten, vom eben gelöschten Kunden geladen

Dazu ein paar Screenshots
Kunde zum löschen auswählen https://www.dropbox.com/s/5qmytmg0zuwz74e/1.png?dl=0
Kunde ist gelöscht https://www.dropbox.com/s/i7j5i1mqp31hs8r/2.png?dl=0
nachgerückter Kunde ist sichtbar, jedoch werden beim anklicken die Daten des vorher gelöschten Kunden geladen. https://www.dropbox.com/s/ewcr39xyb4iqef0/3.png?dl=0

Wenn ich das Programm beende und wieder starte, dann funktioniert die Tabelle wie gewünscht.
Was muss ich beachten, wenn die tabelle aktualisiert werden soll?

VG niesel
__deets__
User
Beiträge: 6178
Registriert: Mittwoch 14. Oktober 2015, 14:29

Montag 25. Februar 2019, 18:55

Ich wuerde ja mit einem QAbstractItemModel arbeiten, das ggf. direkt auf der Datenbank arbeitet. Und das set_locale gehoert irgendwo an den Anfang deines Programms - oder aendert sich deine Plattform zwischendurch?

Aber mal abgesehen davon: woher bezieht denn die Detailansicht ihre Daten? Da liegt doch im Zweifel der Hase im Pfeffer. Genau den Code zeigst du aber nicht.
Benutzeravatar
nieselfriem
User
Beiträge: 93
Registriert: Sonntag 13. Januar 2013, 16:00

Montag 25. Februar 2019, 18:58

Ich habe den Fehler gefunden.

Das Problem ist self.__customer_data.append(customer_list[0:12])
in der Methode def render_customer_table(self):
ich leere nun die Liste

Code: Alles auswählen

....
self.__customer_table.clearSelection()
self.__customer_data.clear()
VG niesel
Antworten