无法运行 Prohorenok 书中的示例。
不会添加或删除行。
也许有人会告诉我或写我自己的,我将非常感激。
from PyQt5 import QtCore, QtWidgets, QtSql
import sys
def addRecord():
stm.insertRow(stm.rowCount())
def delRecord():
stm.removeRow(tv.currentIndex().row())
stm.select()
app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QWidget()
window.setWindowTitle("QRelationalSqlTableModel")
con = QtSql.QSqlDatabase.addDatabase('QSQLITE')
con.setDatabaseName('data.sqlite')
con.open()
stm = QtSql.QSqlRelationalTableModel(parent = window)
stm.setTable('good')
stm.setSort(1, QtCore.Qt.AscendingOrder)
# Задаем для поля категории связь с таблицей списка категорий
stm.setRelation(3, QtSql.QSqlRelation('category', 'id', 'catname'))
stm.select()
stm.setHeaderData(1, QtCore.Qt.Horizontal, 'Название')
stm.setHeaderData(2, QtCore.Qt.Horizontal, 'Кол-во')
stm.setHeaderData(3, QtCore.Qt.Horizontal, 'Категория')
vbox = QtWidgets.QVBoxLayout()
tv = QtWidgets.QTableView()
tv.setModel(stm)
tv.hideColumn(0)
tv.setColumnWidth(1, 150)
tv.setColumnWidth(2, 60)
tv.setColumnWidth(3, 150)
vbox.addWidget(tv)
btnAdd = QtWidgets.QPushButton("&Добавить запись")
btnAdd.clicked.connect(addRecord)
vbox.addWidget(btnAdd)
btnDel = QtWidgets.QPushButton("&Удалить запись")
btnDel.clicked.connect(delRecord)
vbox.addWidget(btnDel)
window.setLayout(vbox)
window.resize(430, 250)
window.show()
sys.exit(app.exec_())

我没看过这本书。您的示例不是用OOP编写的这一事实有点令人担忧。
您没有提供创建数据库和必要表的脚本。
我试图向您介绍我对您的问题的看法。
这是一种可能的解决方案的示例性变体,即 移动的方向。
笔记:
数据库被称为
test_1318914.db;该方法
fillTable()创建两个表 -category和good.字段名称可能与您的不匹配。在应用程序第一次登录/注销后,注释掉对该方法的调用,这样每次进入应用程序时就不会创建表:
# self.fillTable()category表中有两个条目,其中id=1和id=2。如果 table
good包含引用 table 中不存在的行的category键,则包含无效键的行将不会显示在模型中。用户或数据库负责维护参照完整性。
该类
QSqlRelationalTableModel为具有外键支持的单个数据库表提供可编辑的数据模型。更多https://doc.qt.io/qt-5/qsqlrelationaltablemodel.html
主文件