首页 > 解决方案 > model.setTable() 在 pyqt5 中真正做了什么

问题描述

我对 setTable() 方法对 QSqlTableModel 的作用感到困惑。我知道它有点告诉模型它需要使用哪个数据库表,但我在这里遇到了两个让我感到困惑的问题。

假设我创建了一个 foem,它接受用户输入并创建一个数据库并在其中添加行,还有一个用于删除行并显示整个数据库的选项

from PyQt5 import QtCore, QtGui, QtWidgets, QtSql
from form import Ui_MainWindow
import sys


class Example(QtWidgets.QMainWindow):

    def __init__(self):
        super().__init__()

        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.showInfo()

        self.ui.pushButton_AddPatient.clicked.connect(self.create)

        self.ui.pushButton_DeletePatient.clicked.connect(self.deleteinfo)
        self.ui.pushButton.clicked.connect(lambda : self.search(self.ui.lineEdit.text()))

        self.ui.pushButton_ShowPAtient.clicked.connect(self.showall)
        self.show()



    def create(self):
        db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
        db.setDatabaseName('patients.db')
        db.open()
        query = QtSql.QSqlQuery()
        query.exec_(

           # SQL QUERY TO CREATE THE TABLE
        )
        query.exec_(

        #SQL QUERY TO INSERT SOME ROWS TO THE DATABASE
        )

        self.model.select()


   def showall(self):
        self.model.setTable("patients")

        self.model.select()


    def showInfo(self):
        db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
        db.setDatabaseName('patients.db')
        db.open()
        self.model = QtSql.QSqlTableModel()

        self.model.setTable('patients')

        self.ui.tableView.setModel(self.model)
        self.ui.tableView.setSelectionMode(QtWidgets.QTableView.SingleSelection)
        self.ui.tableView.setSelectionBehavior(QtWidgets.QTableView.SelectRows)


        self.model.select()

    def deleteinfo(self):

        #self.model.setTable("patients")
        current = self.ui.tableView.selectedIndexes()

        for item in current:
              self.model.removeRow(item.row())
        self.model.select()

    def search(self, item):
        self.model.setFilter("name LIKE '%{}%'".format(item))
        self.model.select()

我的问题是,为什么我必须self.model.setTable()在我的函数中包含该语句showall()(否则它将不起作用)同时添加它会deleteinfo()导致故障并且程序不会删除选定的行。如果我需要创建其他插槽来使用模型修改数据库怎么办?我需要self.model.setTable()每次都使用吗?

标签: pythondatabasesqlitemodel-view-controllerpyqt5

解决方案


推荐阅读