4.3 支持表间关系的模型
QSqlRelationalTableModel类用于表间关系的模型,其继承层次如下:
QObject - QAbstractltemModel - QAbstractTableModel - QSqlQueryModel -QSqlTableModel - QSqlRelationalTableModel
构造函数为:
QSqlRelationalQueryModel([QObject parent=None][, ][QSqlDatabase db = QSqlDatabase() ])
QSqlRelationalQueryModel类新增了以下方法(详见http://doc.qt.io/qt-5/qsqlrelationaltablemodel.html):
setRelation(int column, QSqlRelation relation):为column字段设置链接。 链连接的信息由QSqiReiation实例来表示。
setJoinMode(QSqlRelationalTableModel.joinMode joinMode):设置模型的绑定模式。joinMode的参数可为:
InnerJoin,0:默认值。不显示没有外键的记录。
LeftJoin,1:显示没有外键的记录。
QSqlRelation类用于表示数据库表之间的关系,其构造函数为:
QSqlRelation(QString tableName, QString indexColumn, QString displayColumn):tableName为外键引用的数据库表名;indexColumn为外键字段;displayColumn为显示的字段。QSqlRelation类有若干方法,但使用不频繁(详见http://doc.qt.io/qt-5/qsqlrelation.html)。
下表为data.sqlite数据库使用关系模型的代码:
from PyQt5 import QtCore, QtWidgets, QtSql
import sys
def addRecord():
stm.insertRow(stm.rowCount())
def delRecord():
stm.removeRow(tv.currentIndex().row())
stm.select()
app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QWidget()
window.setWindowTitle("QRelationalSqlTableModel")
con = QtSql.QSqlDatabase.addDatabase('QSQLITE')
con.setDatabaseName('data.sqlite')
con.open()
stm = QtSql.QSqlRelationalTableModel(parent = window)
stm.setTable('good')
stm.setSort(2, QtCore.Qt.AscendingOrder)
将good表中的category字段设置为到category表的链接
stm.setRelation(3, QtSql.QSqlRelation('category', 'id', 'catname'))
stm.select()
stm.setHeaderData(1, QtCore.Qt.Horizontal, '名称')
stm.setHeaderData(2, QtCore.Qt.Horizontal, '数量')
stm.setHeaderData(3, QtCore.Qt.Horizontal, '类别')
vbox = QtWidgets.QVBoxLayout()
tv = QtWidgets.QTableView()
tv.setModel(stm)
tv.hideColumn(0)
tv.setColumnWidth(1, 150)
tv.setColumnWidth(2, 60)
tv.setColumnWidth(3, 150)
vbox.addWidget(tv)
btnAdd = QtWidgets.QPushButton("添加记录(&A)")
btnAdd.clicked.connect(addRecord)
vbox.addWidget(btnAdd)
btnDel = QtWidgets.QPushButton("删除记录(&A)")
btnDel.clicked.connect(delRecord)
vbox.addWidget(btnDel)
window.setLayout(vbox)
window.resize(430, 250)
window.show()
sys.exit(app.exec_())
运行结果:
- setRelation(int column, QSqlRelation relation):为column字段设置链接。 链连接的信息由QSqiReiation实例来表示。
- setJoinMode(QSqlRelationalTableModel
.joinMode joinMode):设置模型的绑定模式。joinMode的参数可为: -
- InnerJoin,0:默认值。不显示没有外键的记录。
- LeftJoin,1:显示没有外键的记录。
下表为data.sqlite数据库使用关系模型的代码:
from PyQt5 import QtCore, QtWidgets, QtSql
import sys
def addRecord():
def delRecord():
app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QWidget()
window.setWindowTitle("QRelationalSqlTableModel
con = QtSql.QSqlDatabase.addDatabase('QSQLITE')
con.setDatabaseName('data.sqlite')
con.open()
stm = QtSql.QSqlRelationalTableModel
stm.setTable('good')
stm.setSort(2, QtCore.Qt.AscendingOrder)
将good表中的category字段设置为到category表的链接
stm.setRelation(3, QtSql.QSqlRelation('category', 'id', 'catname'))
stm.select()
stm.setHeaderData(1, QtCore.Qt.Horizontal, '名称')
stm.setHeaderData(2, QtCore.Qt.Horizontal, '数量')
stm.setHeaderData(3, QtCore.Qt.Horizontal, '类别')
vbox = QtWidgets.QVBoxLayout()
tv = QtWidgets.QTableView()
tv.setModel(stm)
tv.hideColumn(0)
tv.setColumnWidth(1, 150)
tv.setColumnWidth(2, 60)
tv.setColumnWidth(3, 150)
vbox.addWidget(tv)
btnAdd = QtWidgets.QPushButton("添加记录(&A)")
btnAdd.clicked.connect(addRecord)
vbox.addWidget(btnAdd)
btnDel = QtWidgets.QPushButton("删除记录(&A)")
btnDel.clicked.connect(delRecord)
vbox.addWidget(btnDel)
window.setLayout(vbox)
window.resize(430, 250)
window.show()
sys.exit(app.exec_())
运行结果: