Ich hab eine App mit einem QTableView. Ich möchte die Daten direkt im QTable editieren und die Änderungen sofort in die Datenbank schreiben. Nachfolgend meine Lösung (nur der entscheidende Teil im TableModel) die so weit auch funktioniert aber ich habe den Verdacht, dass das keine sehr elegante Lösung ist. Wie würdet ihr es machen?
Code: Alles auswählen
class TableModel(QtCore.QAbstractTableModel):
def __init__(self, data):
super(TableModel, self).__init__()
self._data = data
#self.rows_nr, self.columns_nr = data.shape
self.hheaders = ["ID", "Datum", "Konto", "Betrag", "Bmkg", "Geschaeft"]
def data(self, index, role=Qt.DisplayRole):
# ...................
def setData(self, index, value, role=Qt.EditRole):
# editieren
if index.isValid() and role == Qt.EditRole:
# self._data ist Tuple und lässt sich nicht editieren und tmp=list(self._data) funktioniert nicht, daher ...
# aber das geht sicher besser/einfacher !?!?!?
tmp = []
for i in range(0, len(self._data)):
t = []
for j in range(0, len(self._data[i])):
t.append(self._data[i][j])
tmp.append(t)
tmp[index.row()][index.column()] = value
self._data = tmp
#self._data[index.row()][index.column()] = value # funktioniert nicht
self.dataChanged.emit(index, index) # ??????
# Daten prüfen
fehler = False
if index.column() == 1: # Spalte Datum
if len(value) != 10:
fehler = True
else:
if value[4:5] != "-" or value[7:8] != "-":
fehler = True
if index.column() == 2: # Spalte Konto
value = value.upper()
if len(value) != 1 or (value != "G" and value != "S" and value != "B"):
fehler = True
if index.column() == 3: # Spalte Betrag
val = str(value).replace(",", ".")
if len(val) < 1:
fehler = True
if index.column() == 4: # Spalte Bmkg
if len(value) < 1:
fehler = True
if fehler == True:
winsound.PlaySound("SystemExclamation", winsound.SND_ALIAS)
#QMessageBox.critical(self, "Fehler", "Fehler bei der Dateneingabe.")
return False
# speichern in der DB
id = self._data[index.row()][0]
f = ["", "Datum", "Konto", "Betrag", "Bmkg", "Geschaeft"]
sqls = "UPDATE KontoPW SET " + f[index.column()] + "="
if index.column() != 3:
sqls += "'" + value + "'"
else:
sqls += val
sqls += " WHERE ID=" + str(id)
file = cwd + "\\Konto.db"
# check if DB-file exists
if not os.path.isfile(file):
#QMessageBox.critical(self, "Fehler", "Die Datei\r\n " + file + "\r\nfehlt.\r\nDas Programm wird beendet.")
winsound.PlaySound("SystemExclamation", winsound.SND_ALIAS)
return False
# connect
conn = sqlite3.connect(file)
cur = conn.cursor()
cur.execute(sqls)
conn.commit()
conn.close()
#self.ShowData()
return True
return False
def rowCount(self, index):
# ...................