美文网首页
PyQt5编程(44)—使用数据库(10)

PyQt5编程(44)—使用数据库(10)

作者: 用电热毯烤猪 | 来源:发表于2018-01-01 21:59 被阅读0次
    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

    相关文章

      网友评论

          本文标题:PyQt5编程(44)—使用数据库(10)

          本文链接:https://www.haomeiwen.com/subject/wwdxnxtx.html