如何使用 QSqlTableModel 从 Qtableview 和 SQLite 中删除行?

How to remove row from Qtableview and SQLite using with QSqlTableModel?

下面是我使用的代码:

from PyQt5 import QtCore, QtGui, QtWidgets, QtSql
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtSql import *
from PyQt5 import uic
import sys
import sqlite3


class UI(QMainWindow):
    def __init__(self):
        super(UI, self).__init__()
        uic.loadUi("tableview.ui", self)
        self.show()
        
        db = QSqlDatabase.addDatabase("QSQLITE")
        db.setDatabaseName("book.db")
        db.open()

        DBModel = QSqlQueryModel()
        DBModel.setQuery("select * from card",db)
        self.tableView.setModel(DBModel)


        self.dbmodel = DBModel
        self.pushButton.clicked.connect(self.removeRow)

                
    def removeRow(self):
        tmodel = QSqlTableModel()
        selected = self.tableView.selectedIndexes()

        rows = set(index.row() for index in selected)
        rows = list(rows)
        rows.sort()
        first = rows[0]

        tmodel.deleteRowFromTable(first)



app = QApplication(sys.argv)
window = UI()
app.exec_()

此代码无法删除 Qtableview 和 SQLite 中的选定行。我正在尝试使用 QSqlTableModel,没有收到任何错误,但它无法正常工作,无法删除该行。我错过了什么。如何解决这个问题?

调用 deleteRowFromTable 没有用,因为你没有 select 任何 table;请注意,您无论如何都不应该使用该功能(来自 docs:

This is a low-level method that operates directly on the database and should not be called directly. Use removeRow() or removeRows() to delete values.

您应该使用 QSqlTableModel instead of QSqlQueryModel. Remember that if any change happens from code, the model requires to be repopulated using select() 以便正确更新视图。

class UI(QMainWindow):
    def __init__(自我):
        超级(UI,自我)。__init__()
        # ...

        <b>DBModel = QSqlTableModel()
        DBModel.setTable("card")
        DBModel.select()</b>
        self.tableView.setModel(数据库模型)

        self.dbmodel = 数据库模型
        self.pushButton.clicked.connect(self.removeRow)

    def removeRow(自我):
        selected = self.tableView.selectedIndexes()

        rows = set(index.row() for index in selected)
        行 = 列表(行)
        rows.sort()
        第一个 = 行 [0]

        self.dbmodel.removeRow(第一个)
        <b>self.dbmodel.select()</b>