4.与数据关联的模型
通常情况下,数据库中存储的数据通过列表或表格等组件显示。对于这些情况,PyQt提供了两个类模型从数据库直接提取数据。
4.1 与SQL查询关联的模型
如果要显示从SQL查询中检索到的数据,但又不需要编辑此数据,则可使用QSqlQueryModel类。 它表示与SQL查询关联的模型。 这个类的继承层次如下:
QObject - QAbstractltemModel - QAbstractTableModel - QSqlQueryModel
QSqlQueryModel类的构造函数为:
QSqlQueryModel([parent = None])
QSqlQueryModel类支持以下方法(详见http://doc.qt.io/qt-5/qsqlquerymodel.html和http://doc.qt.io/qt-5/qabstractitemmodel.html):
setQuery(QString query[, QSqlDatabase db = QSqlDatabase()]):重置模型并设置查询数据。需要注意,查询必须是活动而且没调用isForwardOnly()。db 是可选项,没有设置时,采用默认的连接。
query():返回与此模型关联的QSqlQuery。
record():返回存储查询结果当前记录的一个QSqlRecord实例。
record(int row):返回存储查询结果row条记录的一个QSqlRecord实例。
lastError():数据库发生的最后一条错误信息。
index(int row, int column[, QModelIndex parent = QModelIndex()]): 返回row行,column列和parent父索引指定的模型中项目的索引。
data(QModelIndex index[, int role = Qt.DisplayRole]):返回索引为 index和指定角色下的数据。
rowCount(QModelIndex parent = QModelIndex()):如果数据库支持返回查询的大小,则返回当前查询的行数。 否则,返回当前缓存在客户端上的行数。
sort(int column, Qt.SortOrder order = Qt.AscendingOrder):对模型按column列进行order排序。
setHeaderData(int section, Qt.Orientation orientation, QVariant value[, int role = Qt.EditRole]):设置标题数据。参数section代表行或列的索引或名称;orientation代表行或列;
headerData(int section, Qt.Orientation orientation, int role = Qt.DisplayRole):返回标题数据。参数同上。
下列代码实现将查询数据用表组件显示的功能:
from PyQt5 import QtCore, QtWidgets, QtSql
import sys
app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QTableView()
window.setWindowTitle("QSqlQueryModel")
创建数据库连接
con = QtSql.QSqlDatabase.addDatabase('QSQLITE')
con.setDatabaseName('data.sqlite')
con.open()
创建SQL模型
sqm = QtSql.QSqlQueryModel(parent = window)
sqm.setQuery('select * from good order by goodname')
设置模型的标题栏
sqm.setHeaderData(1, QtCore.Qt.Horizontal, '名字')
sqm.setHeaderData(2, QtCore.Qt.Horizontal, '数量')
将查询结果与表组件关联
window.setModel(sqm)
隐藏第一列
window.hideColumn(0)
window.setColumnWidth(1, 150)
window.setColumnWidth(2, 60)
window.resize(230, 130)
window.show()
sys.exit(app.exec_())