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))
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
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
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
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