分页视图查询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 实现分页查询的使用方法。运行效果如图所示。
本案例使用的数据库文件位于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())