PyQt5 Sqlite ID der Abfrage unsichtbar speichern

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Welpe
User
Beiträge: 26
Registriert: Mittwoch 30. Dezember 2020, 10:39

Moin,

kurze Erklärung zu meinem Problem: Ich rufe alle Daten einer Tabelle aus einer Sqlite Datenbank ab und übergebe diese dem QTableWidget. Ein Doppelklick auf einen Feld im QTableWidget übergibt mir alle Werte der ausgewählten Zeile zur weiteren Bearbeitung an passende Eingabefelder. Nach der Bearbeitung soll der Datensatz dann wieder in die Datenbank geschrieben werden. Das klappt auch alles wunderbar, allerdings nur mit Anzeige der ID des jeweiligen Datensatzes. Ich möchte diese ID aber nicht sichtbar im UI haben da sie für den Benutzer nicht relevant ist.

Wie kann ich diese ID elegant im Interface verstecken und trotzdem mit an das TableWidget und weiter zum aktualisieren der Daten übergeben denn ohne ID geht es ja auch nicht ?!

Hier mal die betreffende Abschnitte um zu verstehen was ich meine.

Code: Alles auswählen

# Alle Daten der Tabelle abrufen
def db_laden_alles(): 
        connection = sqlite3.connect('data.db')
        cur = connection.cursor()
        sqlquery = 'SELECT zugang, benutzername, passwort, rowid FROM zugangsdaten ORDER BY zugang ASC'
        cur.execute(sqlquery)
        daten = cur.fetchall()
        anzahl = len(daten)
        db_daten_anzeigen(anzahl, daten)

Code: Alles auswählen

# Die abgerufenen Daten an das TableWidget übergeben und anzeigen
import PyQt5.QtWidgets as widgets
import PyQt5.uic as uic
window = uic.loadUi('ui/main.ui')

def db_daten_anzeigen(anzahl, daten):
        window.tableWidget.setRowCount(anzahl)
        for tablerow,row in enumerate(daten):
            window.tableWidget.setItem(tablerow, 0, widgets.QTableWidgetItem(row[0]))
            window.tableWidget.setItem(tablerow, 1, widgets.QTableWidgetItem(row[1]))
            window.tableWidget.setItem(tablerow, 2, widgets.QTableWidgetItem(str(row[2])))
            window.tableWidget.setItem(tablerow, 3, widgets.QTableWidgetItem(str(row[3])))

Code: Alles auswählen

# Doppelklick auf einen Eintrag im TableWidget ...
window.tableWidget.doubleClicked.connect(bearbeiten)

# ...sendet die ausgewählte Zeile an entsprechende Eingabefelder
def bearbeiten(selected):
        zugang = window.tableWidget.item(selected.row(), 0)
        window.ety_zugang.setText(zugang.text())
        benutzer = window.tableWidget.item(selected.row(), 1)
        window.ety_benutzername.setText(benutzer.text())
        passwort = window.tableWidget.item(selected.row(), 2)
        window.ety_passwort.setText(passwort.text())
        rowid = window.tableWidget.item(selected.row(), 3)
        window.lbl_rowid.setText(rowid.text())

Code: Alles auswählen

# Datensatz aus den Eingabefeldern wird in die Datenbank geschrieben / aktualisiert
    def aktualisieren():
        if window.ety_zugang.text() == '' or window.ety_benutzername.text() == '' or window.ety_passwort.text() == '':
            msg = widgets.QMessageBox()
            msg.setWindowTitle('Eingabe unvollständig!')
            msg.setText('Bitte alle Felder ausfüllen.')
            msg.setIcon(widgets.QMessageBox.Critical)
            x = msg.exec()
        elif window.lbl_rowid.text() == '':
            msg = widgets.QMessageBox()
            msg.setWindowTitle('Aktualisieren nicht möglich!')
            msg.setText('Datensatz ist noch nicht vorhanden.')
            msg.setInformativeText('Bitte erst den neuen Datensatz speichern.')
            msg.setIcon(widgets.QMessageBox.Critical)
            x = msg.exec()
        else:
            def ok_button(i):
                if i.text() == '&OK':
                    connection = sqlite3.connect('data.db')
                    cur = connection.cursor()
                    update_data = "UPDATE zugangsdaten SET zugang = ?, benutzername = ?, passwort = ? WHERE rowid = ?"
                    cur.execute(update_data, (window.ety_zugang.text(), window.ety_benutzername.text(), window.ety_passwort.text(), window.lbl_rowid.text()))
                    connection.commit()
                    db_laden_alles()
                    eingabefelder_leeren()
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Für GUI-Progamme muß man immer eigene Klassen definieren. Du benutzt hier munter globale Variablen, was auch schon nicht sein sollte.
Wenn Du eine Klasseinstanz hast, ist es auch kein Problem, darin ein Attribut mit der ID zu speichern.
Antworten