QSqlTableModel wie Datensatz aus Datenbank löschen

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

Moin,
ich probiere ein wenig mit dem Model / View System von PySide6 herum. Ich habe Eingaben aus einem QLineEdit und einem QDateEdit, welche ich in eine SQLite Datenbank ablege und anschließend in einem QListView ausgeben lasse. Das funktioniert soweit auch alles.

Ich bekomme es allerdings nicht hin, einen Datensatz über dieses Model / View System wieder aus der Datenbank zu löschen. Kann mir vielleicht jemand erklären, wie das Löschen funktionieren soll?

Hier ein kleines Beispiel, wo dies veranschaulicht wird. Ich habe die Funktion "remove_task()" frei gelassen, evtl kann das ja jemand vervollständigen.

Code: Alles auswählen

# create_db.py

import sqlite3


def create_db():
    connection = sqlite3.connect("data.db")
    cursor = connection.cursor()

    sql = """
    CREATE TABLE IF NOT EXISTS tasks (
    "id"	INTEGER,
	"task"	TEXT,
	"date"	TEXT,
	PRIMARY KEY("id" AUTOINCREMENT)
    );"""

    cursor.execute(sql)

    connection.commit()
    connection.close()

Code: Alles auswählen

# main.py

import sys

from PySide6.QtSql import QSqlDatabase, QSqlTableModel
from PySide6.QtWidgets import QApplication, QDataWidgetMapper, QMainWindow

import create_db
from ui_main import Ui_MainWindow


class Main_Window(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        # Initialize the db
        create_db.create_db()

        # Set up the model
        self.model = QSqlTableModel(self)
        self.model.setTable("tasks")
        self.model.select()

        # Set up the view
        self.listView.setModel(self.model)
        self.listView.setModelColumn(1)

        # Connect the buttons
        self.btn_add.clicked.connect(self.add_new_task)
        self.btn_remove.clicked.connect(self.remove_task)
        self.listView.selectionModel().selectionChanged.connect(self.selection_changed)

    def add_new_task(self):
        row = self.model.rowCount()
        self.model.insertRow(row)

        self.mapper = QDataWidgetMapper(self)
        self.mapper.setModel(self.model)
        self.mapper.setSubmitPolicy(QDataWidgetMapper.SubmitPolicy.ManualSubmit)
        self.mapper.setCurrentIndex(row)

        self.mapper.addMapping(self.lineEdit, 1)
        self.mapper.addMapping(self.dateEdit, 2)

        self.mapper.submit()

        # Clear the lineEdit after submit
        self.lineEdit.setText("")

    def selection_changed(self):
        index = self.listView.currentIndex()
        if index.isValid():

            # Select the fields to read
            task_index = self.model.index(index.row(), 0)
            task_dates = self.model.index(index.row(), 2)
            task_values = self.model.index(index.row(), 1)

            # Read the data
            task_id = self.model.data(task_index)
            task_date = self.model.data(task_dates)
            task_value = self.model.data(task_values)

            # Print the data
            print(
                f"task_id: {task_id}, task_date: {task_date}, task_value: {task_value}"
            )

    def remove_task(self):
        pass


if __name__ == "__main__":
    app = QApplication(sys.argv)

    db = QSqlDatabase.addDatabase("QSQLITE")
    db.setDatabaseName("data.db")

    window = Main_Window()
    window.show()

    sys.exit(app.exec())

Code: Alles auswählen

# ui_main.py

# -*- coding: utf-8 -*-

################################################################################
## Form generated from reading UI file 'main.ui'
##
## Created by: Qt User Interface Compiler version 6.11.2
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################

from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
    QMetaObject, QObject, QPoint, QRect,
    QSize, QTime, QUrl, Qt)
from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
    QFont, QFontDatabase, QGradient, QIcon,
    QImage, QKeySequence, QLinearGradient, QPainter,
    QPalette, QPixmap, QRadialGradient, QTransform)
from PySide6.QtWidgets import (QApplication, QDateEdit, QLabel, QLineEdit,
    QListView, QMainWindow, QPushButton, QSizePolicy,
    QWidget)

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        if not MainWindow.objectName():
            MainWindow.setObjectName(u"MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName(u"centralwidget")
        self.listView = QListView(self.centralwidget)
        self.listView.setObjectName(u"listView")
        self.listView.setGeometry(QRect(120, 60, 481, 491))
        self.lineEdit = QLineEdit(self.centralwidget)
        self.lineEdit.setObjectName(u"lineEdit")
        self.lineEdit.setGeometry(QRect(120, 20, 481, 26))
        self.btn_add = QPushButton(self.centralwidget)
        self.btn_add.setObjectName(u"btn_add")
        self.btn_add.setGeometry(QRect(630, 60, 151, 31))
        self.label = QLabel(self.centralwidget)
        self.label.setObjectName(u"label")
        self.label.setGeometry(QRect(20, 20, 81, 31))
        self.dateEdit = QDateEdit(self.centralwidget)
        self.dateEdit.setObjectName(u"dateEdit")
        self.dateEdit.setGeometry(QRect(629, 20, 151, 27))
        self.dateEdit.setCalendarPopup(True)
        self.dateEdit.setDate(QDate(2026, 8, 23))
        self.btn_remove = QPushButton(self.centralwidget)
        self.btn_remove.setObjectName(u"btn_remove")
        self.btn_remove.setGeometry(QRect(630, 510, 151, 31))
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)

        QMetaObject.connectSlotsByName(MainWindow)
    # setupUi

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
        self.btn_add.setText(QCoreApplication.translate("MainWindow", u"Hinzuf\u00fcgen", None))
        self.label.setText(QCoreApplication.translate("MainWindow", u"QLineEdit", None))
        self.btn_remove.setText(QCoreApplication.translate("MainWindow", u"L\u00f6schen", None))
    # retranslateUi
Antworten