После переопределения метода QSqlTableModel.data() не удаляются записи из БД

Рейтинг: 0Ответов: 0Опубликовано: 05.07.2023

Проблема заключается в том, что после того как я переопределил метод data() в QSqlTableModel, в случае добавления в БД записи в которой одно из полей будет пустое (Null) эту запись нельзя удалить из таблицы (и из БД), если не переопределять метод data() все работает, запись с полями Null удаляется , методом проб и ошибок я дошел до того что сделал поля в таблице NOT NULL, тогда проблема не проявляется. Хотелось бы разобраться почему так происходит и что я делаю не правильно. Буду безмерно благодарен за ответ))

введите сюда описание изображения

import datetime
import sys

import qdarktheme
from PyQt5 import QtWidgets, QtSql, QtGui
from PyQt5.QtCore import Qt, pyqtSlot
from PyQt5.QtSql import QSqlTableModel
from PyQt5.QtWidgets import QItemDelegate

from ui_app import Ui_Form


class TableModel(QSqlTableModel):
    def __init__(self):
        super().__init__()

    def set_header(self):
        self.setHeaderData(0, Qt.Horizontal, "Имя")
        self.setHeaderData(1, Qt.Horizontal, "Пол")
        self.setHeaderData(2, Qt.Horizontal, "Возраст")
        self.setHeaderData(3, Qt.Horizontal, "Счет")
        self.setHeaderData(4, Qt.Horizontal, "Дата")

    def data(self, idx, role=None):
        value = super().data(idx, Qt.DisplayRole)
        if role == Qt.DecorationRole:
            if idx.column() == 4:
                return QtGui.QIcon("assets/calendar.png")
            if idx.column() == 1:
                if value == "мужской":
                    return QtGui.QIcon("assets/ok.png")
                if value == "женский":
                    return QtGui.QIcon("assets/false.png")
        elif role == Qt.ForegroundRole:
            if idx.column() == 4:
                return QtGui.QColor("green")
        elif role == Qt.TextAlignmentRole:
            if idx.column() == 2 or idx.column() == 3:
                return Qt.AlignCenter
        return super().data(idx, role)


class ItemDelegate(QItemDelegate):
    def __init__(self, parent):
        super(ItemDelegate, self).__init__(parent)

    def createEditor(self, parent, option, index):
        column = index.column()
        if column == 0:
            editor = QtWidgets.QLineEdit(parent)
            return editor
        elif column == 1:
            editor = QtWidgets.QComboBox(parent)
            editor.addItems(["мужской", "женский"])
            return editor
        elif column == 2:
            editor = QtWidgets.QSpinBox(parent)
            editor.setMaximum(100)
            return editor
        elif column == 3:
            editor = QtWidgets.QSpinBox(parent)
            editor.setMaximum(100000)
            return editor
        elif column == 4:
            editor = QtWidgets.QDateEdit(parent=parent, calendarPopup=True)
            editor.setDate(datetime.datetime.now())
            return editor


class WindowApp(QtWidgets.QWidget, Ui_Form):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.setWindowTitle("Приложение")
        self.setFixedSize(560, 500)
        self.con = QtSql.QSqlDatabase.addDatabase("QSQLITE")
        self.con.setDatabaseName("app_db.db")
        self.con.open()
        self.model = TableModel()
        self.model.setTable("users")
        self.model.select()
        self.model.set_header()
        self.tableView.setItemDelegate(ItemDelegate(self.tableView))
        self.tableView.setModel(self.model)
        self.tableView.resizeRowsToContents()

        self.btnAdd.clicked.connect(self.add_record)
        self.btnDel.clicked.connect(self.del_record)


    @pyqtSlot()
    def add_record(self):
        self.model.insertRow(self.model.rowCount())
        self.model.submit()

    @pyqtSlot()
    def del_record(self):
        current_row = self.tableView.currentIndex().row()
        self.model.removeRow(current_row)

        self.model.select()


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    qss = """QDateEdit::drop-down{image:url('assets/calendar.png');}"""
    qdarktheme.setup_theme(custom_colors={"primary": "#00FF7F", "background": "#696969"}, additional_qss=qss)
    window = WindowApp()
    window.show()
    sys.exit(app.exec_())

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(425, 300)
        self.verticalLayout = QtWidgets.QVBoxLayout(Form)
        self.verticalLayout.setObjectName("verticalLayout")
        self.tableView = QtWidgets.QTableView(Form)
        self.tableView.setObjectName("tableView")
        self.verticalLayout.addWidget(self.tableView)
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.label = QtWidgets.QLabel(Form)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.horizontalLayout_2.addWidget(self.label)
        self.dateEdit_1 = QtWidgets.QDateEdit(Form, calendarPopup=True)

        self.dateEdit_1.setObjectName("dateEdit_1")
        self.horizontalLayout_2.addWidget(self.dateEdit_1)
        self.label_2 = QtWidgets.QLabel(Form)
        self.label_2.setAlignment(QtCore.Qt.AlignCenter)
        self.label_2.setObjectName("label_2")
        self.horizontalLayout_2.addWidget(self.label_2)
        self.dateEdit_2 = QtWidgets.QDateEdit(Form, calendarPopup=True)
        self.dateEdit_2.setObjectName("dateEdit_2")
        self.horizontalLayout_2.addWidget(self.dateEdit_2)
        self.verticalLayout.addLayout(self.horizontalLayout_2)
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.btnAdd = QtWidgets.QPushButton(Form)
        self.btnAdd.setObjectName("btnAdd")
        self.horizontalLayout.addWidget(self.btnAdd)
        self.btnDel = QtWidgets.QPushButton(Form)
        self.btnDel.setObjectName("btnDel")
        self.horizontalLayout.addWidget(self.btnDel)
        self.btnFiltre = QtWidgets.QPushButton(Form)
        self.btnFiltre.setObjectName("btnFiltre")
        self.horizontalLayout.addWidget(self.btnFiltre)
        self.verticalLayout.addLayout(self.horizontalLayout)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "MyApp"))
        self.label.setText(_translate("Form", "с"))
        self.label_2.setText(_translate("Form", "по"))
        self.btnAdd.setText(_translate("Form", "Добавить"))
        self.btnDel.setText(_translate("Form", "Удалить"))
        self.btnFiltre.setText(_translate("Form", "Фильтр"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())```


BEGIN TRANSACTION;
CREATE TABLE IF NOT EXISTS "users" (
    "name"  TEXT,
    "sex"   TEXT DEFAULT 1,
    "old"   INTEGER,
    "score" INTEGER DEFAULT 0,
    "date"  TEXT
);
INSERT INTO "users" VALUES ('Николай','мужской',23,4235,'2023-07-06');
INSERT INTO "users" VALUES ('Ирина','женский',24,18,'2023-07-07');
INSERT INTO "users" VALUES ('Юлия','женский',16,5575,'2023-07-08');
INSERT INTO "users" VALUES ('Степан','мужской',16,0,'2023-07-08');
INSERT INTO "users" VALUES ('Федор','мужской',27,5555,'2023-07-10');
INSERT INTO "users" VALUES ('Игорь','мужской',30,0,NULL);
COMMIT;

Ответы

Ответов пока нет.