【问题标题】:How to remove row from Qtableview and SQLite using with QSqlTableModel?如何使用 QSqlTableModel 从 Qtableview 和 SQLite 中删除行?
【发布时间】:2020-11-21 05:03:14
【问题描述】:

下面是我正在使用的代码:

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,没有出现错误,但它无法删除行。我错过了一些东西。如何解决这个问题?

【问题讨论】:

  • 使用QSqlQueryModel作为表的模型,而不是直接使用QSqlTableModel,有什么具体原因吗?
  • 不,实际上我在互联网上搜索过,我试过了。是否可以直接使用 QSqlTableModel 而不使用 QSqlQueryModel ?

标签: python-3.x sqlite pyqt5 qtableview qtsql


【解决方案1】:

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

这是一种直接对数据库进行操作的低级方法,不应直接调用。使用 removeRow() 或 removeRows() 删除值。

您应该使用QSqlTableModel 而不是 QSqlQueryModel。请记住,如果代码发生任何更改,则需要使用 select() 重新填充模型,以便正确更新视图。

class UI(QMainWindow):
    def __init__(self):
        super(UI, self).__init__()
        # ...

        DBModel = QSqlTableModel()
        DBModel.setTable("card")
        DBModel.select()
        self.tableView.setModel(DBModel)

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

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

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

        self.dbmodel.removeRow(first)
        self.dbmodel.select()

【讨论】:

  • 那么,这里不需要使用 REVERSE 顺序删除行吗?我说的对吗?
  • 不,你不是。根据编辑策略(以及我相信数据库后端的工作方式),您可能会得到不一致的结果。继续以相反的顺序删除行,它总是更安全且没有禁忌症。
  • 的意思,比如如果去掉单行就不用倒序了?如果删除多行,是否需要使用逆序?
  • 如果删除一行,为什么需要排序?
猜你喜欢
  • 2020-11-15
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
  • 2023-03-09
  • 2011-08-11
  • 1970-01-01
相关资源
最近更新 更多