157-数据库操作和模型-QSQL模型-分页视图查询QSqlQueryModel

分页视图查询QSqlQueryModel

QSqlQueryModel类为SQL结果集提供只读数据模型

分页视图查询QSqlQueryModel官方说明

QSqlQueryModel是一个高级接口,用于执行SQL语句和遍历结果集。它构建在较低级别的QSqlQuery之上,可用于为视图类(如QTableView)提供数据。例如:

model = QSqlQueryModel()
model.setQuery("SELECT name, salary FROM employee")
model.setHeaderData(0, Qt.Horizontal, tr("Name"))
model.setHeaderData(1, Qt.Horizontal, tr("Salary"))

view = QTableView()

view.setModel(model)

view.show()

我们设置了模型的查询,然后设置了视图标题中显示的标签。
QSqlQueryModel也可以用于以编程方式访问数据库,而无需将其绑定到视图:

model = QSqlQueryModel()
model.setQuery("SELECT name, salary FROM employee")
salary = model.record(4).value("salary").toInt()

上面的代码片段从SELECT查询的结果集中的记录4中提取了salary字段。由于工资是第二列(或列索引1),我们可以将最后一行重写如下:

salary = model.data(model.index(4, 1)).toInt()

默认情况下,该模型是只读的。要使其读写,必须对其进行子类化并重新实现setData()和flags()。另一种选择是使用QSqlTableModel,它提供了一个基于单个数据库表的读写模型。

querymodel示例说明了如何使用QSqlQueryModel来显示查询的结果。它还展示了如何在向用户显示数据之前对QSqlQueryModel进行子类化以自定义数据的内容,以及如何基于QSqlQueryModel创建读写模型。

如果数据库没有返回查询中所选行的数量,则模型将递增地获取行。有关详细信息,请参阅fetchMore()。

分页视图查询QSqlQueryModel方法
方法描述
QSqlQueryModel([parent=None])->PySide6.QtCore.QObject使用给定的父级创建一个空的QSqlQueryModel。
beginInsertColumns(parent:PySide6.QtCore.QModelIndex, first:int, last:int)
beginInsertRows(parent, first, last)
beginRemoveColumns(parent, first, last)
beginRemoveRows(parent, first, last)
beginResetModel()
clear()清除模型并释放所有获取的资源。
endInsertColumns()
endInsertRows()
endRemoveColumns()
endRemoveRows()
endResetModel()
indexInQuery(item:PySide6.QtCore.QModelIndex)->PySide6.QtCore.QModelIndex返回模型中给定项的数据库结果集中值的索引。
如果没有插入、删除或移动任何列或行,则返回值与项相同。
如果项越界或项未指向结果集中的值,则返回无效的模型索引。
lastError()->PySide6.QtSql.QSqlError返回有关数据库上发生的最后一个错误的信息。
queryChange()只要查询发生更改,就会调用此虚拟函数。默认实现不执行任何操作。
query()返回新的查询。
record()->PySide6.QtSql.QSqlRecord这是一个重载函数。
返回一个空记录,该记录包含有关当前查询的字段的信息。
如果模型未初始化,将返回一条空记录。
record(row: int)->PySide6.QtSql.QSqlRecord返回包含有关当前查询的字段信息的记录。如果行是一个有效行的索引,则该记录将填充该行的值。
如果模型未初始化,将返回一条空记录。
setLastError(error:PySide6.QtSql.QSqlError)受保护的函数,它允许派生类将数据库上发生的最后一个错误的值设置为error。
setQuery(query:PySide6.QtSql.QSqlQuery)此函数已弃用。请改用setQuery(QSqlQuery&&query)重载。
这是一个重载函数。
setQuery(query:str[, db:PySide6.QtSql.QSqlDatabase=QSqlDatabase()])这是一个重载函数。
对给定的数据库连接数据库执行查询查询。如果未指定数据库(或无效数据库),则使用默认连接。
如果设置查询时出错,lastError()可用于检索详细信息。
model = QSqlQueryModel()
model.setQuery(“select * from MyTable”)
if model.lastError().isValid():
print(model.lastError())
分页视图查询QSqlQueryModel例子

演示QTableView 控件结合 QSqlQueryModel 实现分页查询的使用方法。运行效果如图所示。

image-20230326020739529

本案例使用的数据库文件位于database.db 中,该文件由创建数据库相关章节实例中的 createDataPandas()函数创建,如果这个数据库文件不存在,则重新运行以创建文件。

from PySide6.QtWidgets import *
from PySide6.QtGui import *
from PySide6.QtCore import *
from PySide6.QtSql import QSqlDatabase,QSqlRelationalTableModel,QSqlRelation,QSqlRelationalDelegate
import sys
import os

os.chdir(os.path.dirname(__file__))


class SqlRelationalTableDemo(QMainWindow):

    def __init__(self,parent=None):
        super(SqlRelationalTableDemo,self).__init__(parent)
        self.setWindowTitle("QSqlRelationalTableModel案例")
        self.resize(550,600)
        self.initModel()
        self.createWindow()

    def initModel(self):
        self.model = QSqlRelationalTableModel()
        self.model.setTable("student2")
        self.model.setRelation(2,QSqlRelation("sex","id","name"))
        self.model.setRelation(3,QSqlRelation("subject","id","name"))
        self.model.setHeaderData(0,Qt.Horizontal,"编号")

        self.model.setHeaderData(1,Qt.Horizontal,"姓名")
        self.model.setHeaderData(2,Qt.Horizontal,"性别")
        self.model.setHeaderData(3,Qt.Horizontal,"科目")
        self.model.setHeaderData(4,Qt.Horizontal,"成绩")
        self.model.select()

    def createWindow(self):
        self.tableView = QTableView()
        self.tableView.setModel(self.model)
        self.tableView.setItemDelegate(QSqlRelationalDelegate(self.tableView))
        self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

        self.tableView2 = QTableView()
        self.tableView2.setModel(self.model)
        self.tableView2.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

        self.tableView3 = QTableView()
        model3 = QSqlRelationalTableModel()
        model3.setTable('student2')
        model3.select()
        self.tableView3.setModel(model3)
        self.tableView3.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

        layout = QVBoxLayout()
        layout.addWidget(self.tableView)
        layout.addSpacing(10)
        layout.addWidget(self.tableView2)
        layout.addSpacing(10)
        layout.addWidget(self.tableView3)
        widget = QWidget()
        self.setCentralWidget(widget)
        widget.setLayout(layout)


if __name__ =="__main__":
    app = QApplication(sys.argv)
    db = QSqlDatabase.addDatabase('QSQLITE')
    db.setDatabaseName('./db/database.db')
    if db.open()is not True:
        QMessageBox.critical(QWidget(),"警告","数据连接失败,程序即将退出")
        exit()
    demo = SqlRelationalTableDemo()
    demo.show()
    sys.exit(app.exec())

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

士别三日,当挖目相待

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值