PyQt5从入门到实践系列-20-Model/View的使用指南-02-QSqlQueryModel

本文介绍了如何在PyQt5中使用QSqlQueryModel构建Model/View结构,包括UI界面设计、设置查询、字段映射和数据库操作,展示了如何通过QSqlQueryModel实现数据的动态展示和管理。
摘要由CSDN通过智能技术生成

 

在上上一期,我们详细介绍了Model/View结构-QSqlTableModel以及在上一期详细介绍了Model/View的原理及使用【PyQt5从入门到实践系列-20-Model/View的使用指南-01】。【PyQt5从入门到实践系列-19-玩转GUI中的数据库-01-QSqlTableModel】。本期,介绍另一种Model/View结构-QSqlQueryModel。

图片

1、ui界面设计 

2、关键代码

class QmyMainWindow(QMainWindow):

    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.setCentralWidget(self.ui.splitter)

        self.ui.tableView.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.ui.tableView.setSelectionMode(QAbstractItemView.SingleSelection)
        self.ui.tableView.setAlternatingRowColors(True)
        self.ui.tableView.verticalHeader().setDefaultSectionSize(22)
        self.ui.tableView.horizontalHeader().setDefaultSectionSize(60)

    #获取所有字段
    def getFieldNames(self):
        score_record = self.query_model.record()
        self.field_number = {}
        for i in range(score_record.count()):
            fieldName = score_record.fieldName(i)
            self.field_number.setdefault(fieldName)
            self.field_number[fieldName] = i

    def openTable(self):
        #创建QSqlQueryModel,设置字段显示名
        self.query_model = QSqlQueryModel(self)
        #使用其setQuery()函数设置一条SELECT查询语句
        #用于从一个或多个数据表中查询记录
        self.query_model.setQuery('''SELECT * FROM score ORDER BY ID''')

        #使用QSqlQueryModel的setHeaderData()函数为每个字段设置显示标题
        self.query_model.setHeaderData(0, Qt.Horizontal, "学号")
        self.query_model.setHeaderData(1, Qt.Horizontal, "姓名")
        self.query_model.setHeaderData(2, Qt.Horizontal, "性别")
        self.query_model.setHeaderData(3, Qt.Horizontal, "年龄")
        self.query_model.setHeaderData(4, Qt.Horizontal, "语文")
        self.query_model.setHeaderData(5, Qt.Horizontal, "数学")
        self.query_model.setHeaderData(6, Qt.Horizontal, "英语")
        self.query_model.setHeaderData(7, Qt.Horizontal, "化学")
        self.query_model.setHeaderData(8, Qt.Horizontal, "物理")
        self.query_model.setHeaderData(9, Qt.Horizontal, "生物")
        #创建界面组件与数据模型的字段之间的数据映射
        #创建QDataWidgetMapper数据映射对象self.mapper并设置self.qryModel为其数据模型。
        self.mapper = QDataWidgetMapper()
        self.mapper.setModel(self.query_model)
        # 创建界面组件与query_model的具体字段之间的联系
        self.mapper.addMapping(self.ui.lineEdit_2, 0)
        self.mapper.addMapping(self.ui.lineEdit_3, 1)
        self.mapper.addMapping(self.ui.comboBox_2, 2)
        self.mapper.addMapping(self.ui.lineEdit_5, 3)
        self.mapper.addMapping(self.ui.lineEdit_6, 4)
        self.mapper.addMapping(self.ui.lineEdit_7, 5)
        self.mapper.addMapping(self.ui.lineEdit_8, 6)
        self.mapper.addMapping(self.ui.lineEdit_4, 7)
        self.mapper.addMapping(self.ui.lineEdit_9, 8)
        self.mapper.addMapping(self.ui.lineEdit_10, 9)
        #移动到首记录
        self.mapper.toFirst()
        #选择模型
        self.selection_model = QItemSelectionModel(self.query_model)
        #记录移动,触发事件
        self.selection_model.currentRowChanged.connect(self.do_currentRowChanged)
        #设置数据模型
        self.ui.tableView.setModel(self.query_model)
        self.ui.tableView.setSelectionModel(self.selection_model)

    def refreshTableView(self):
        #获取当前行号
        index = self.mapper.currentIndex()
        curIndex = self.query_model.index(index, 1)
        self.selection_model.clearSelection()
        self.selection_model.setCurrentIndex(curIndex, QItemSelectionModel.Select)

    @pyqtSlot()
    #通过QFileDialog对话框打开数据库文件
    def on_openFile_triggered(self):
        filename, _ = QFileDialog.getOpenFileName(self, "选择数据库文件", "",
                                                      "SQL Lite数据库(*.db *.db3)")
        #添加 SQL LITE数据库驱动
        self.DB = QSqlDatabase.addDatabase("QSQLITE")
        #设置数据库名称
        self.DB.setDatabaseName(filename)
        if self.DB.open():
            #实现数据查询、显示操作
            self.openTable()
        else:
            QMessageBox.warning(self, "错误", "打开数据库失败")

    @pyqtSlot() #记录移动
    def on_pushButton_3_clicked(self):
        self.mapper.toFirst()
        self.refreshTableView()

    @pyqtSlot()
    def on_pushButton_clicked(self):
        self.mapper.toPrevious()
        self.refreshTableView()

    @pyqtSlot()
    def on_pushButton_2_clicked(self):
        self.mapper.toNext()
        self.refreshTableView()

    @pyqtSlot()
    def on_pushButton_4_clicked(self):
        self.mapper.toLast()
        self.refreshTableView()

    def do_currentRowChanged(self, current, previous):
        self.mapper.setCurrentIndex(current.row())

3、界面效果

 

4、总结 

PyQt中的Model/View结构提供了一种有效的方法来组织和管理应用程序中的数据,并将其呈现给用户。通过合理使用模型、视图、委托和选择模型,你可以创建出功能强大且易于维护的用户界面。本小节,通过一个小案例详细介绍了PyQt5里面的QSqlQueryModel模型使用操作

参考:Python Qt GUI数据可视化编程

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值