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
