在上上一期,我们详细介绍了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数据可视化编程