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

运行结果: <wbr> <wbr> 4.3 <wbr>支持表间关系的模型

<wbr> <wbr> QSqlRelationalTableModel<wbr>类用于表间关系的模型,其继承层次如下:

<wbr> <wbr> QObject - QAbstractltemModel - QAbstractTableModel - QSqlQueryModel -QSqlTableModel - QSqlRelationalTableModel<wbr>

<wbr> <wbr> 构造函数为:

<wbr> <wbr> QSqlRelationalQueryModel<wbr>([QObject parent=None][, ][QSqlDatabase db = QSqlDatabase() ])

<wbr> <wbr> QSqlRelationalQueryModel<wbr>类新增了以下方法(详见http://doc.qt.io/qt-5/qsqlrelationaltablemodel<wbr>.html):

  • setRelation(int column, QSqlRelation relation):为column字段设置链接。 链连接的信息由QSqiReiation实例来表示。
  • setJoinMode(QSqlRelationalTableModel<wbr>.joinMode joinMode):设置模型的绑定模式。joinMode的参数可为:
    • InnerJoin,0:默认值。不显示没有外键的记录。
    • LeftJoin,1:显示没有外键的记录。

<wbr> <wbr> <wbr>QSqlRelation类用于表示数据库表之间的关系,其构造函数为:

<wbr> <wbr> QSqlRelation(QString tableName, QString indexColumn, QString displayColumn):tableName为外键引用的数据库表名;indexColumn为外键字段;displayColumn为显示的字段。QSqlRelation类有若干方法,但使用不频繁(详见http://doc.qt.io/qt-5/qsqlrelation.html)。

下表为data.sqlite数据库使用关系模型的代码: <wbr>

from PyQt5 import QtCore, QtWidgets, QtSql

import sys

def addRecord():

<wbr> <wbr> stm.insertRow(stm.rowCount())

def delRecord():

<wbr> <wbr> stm.removeRow(tv.currentIndex().row())

<wbr> <wbr> stm.select()

app = QtWidgets.QApplication(sys.argv)

window = QtWidgets.QWidget()

window.setWindowTitle("QRelationalSqlTableModel<wbr>")

con = QtSql.QSqlDatabase.addDatabase('QSQLITE')

con.setDatabaseName('data.sqlite') <wbr>

con.open()

stm = QtSql.QSqlRelationalTableModel<wbr>(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_())

运行结果:


图片.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容