pyqt5对mysql的操作,PyQt5编程(44)—使用数据库(10)

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_())

运行结果: 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_())

运行结果:

fb1867bc0d6e

图片.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值