github 中关于Pyqt 的module view 操作练习

代码摘自,Pyside6 中的示例代码部分

# -*- coding: utf-8 -*- import sys
from PySide6.QtWidgets import *
from PySide6.QtGui import *
from PySide6.QtCore import *
from PySide6.QtSql import QSqlDatabase, QSqlQueryModel, QSqlQuery
import os
os.chdir(os.path.dirname(__file__))ID, NAME, SUBJECT, SEX, AGE, SCORE, DESCRIBE = range(7)class CustomSqlModel(QSqlQueryModel):editSignal = Signal()def __init__(self):super(CustomSqlModel, self).__init__()def data(self, index: QModelIndex, role=Qt.DisplayRole):value = QSqlQueryModel.data(self, index, role)# 调整数据显示内容if value is not None and role == Qt.DisplayRole:if index.column() == ID:return '#' + str(value)elif index.column() == SCORE:return int(value + 0.5)# 设置前景色if role == Qt.ForegroundRole:if index.column() == NAME:return QColor(Qt.blue)elif index.column() == SUBJECT:return QColor(Qt.darkYellow)elif index.column() == SCORE:score = QSqlQueryModel.data(self, index, Qt.DisplayRole)if score < 80:return QColor(Qt.black)elif score < 90:return QColor(Qt.darkGreen)elif score < 100:return QColor(Qt.red)return valuedef flags(self, index: QModelIndex):# 设置允许编辑的行flags = QSqlQueryModel.flags(self, index)if index.column() in [NAME, SUBJECT, AGE, SCORE]:flags |= Qt.ItemIsEditablereturn flagsdef setData(self, index: QModelIndex, value, role=Qt.EditRole):# 限制特定列才能编辑if index.column() not in [NAME, SUBJECT, AGE, SCORE]:return False# 数值发生变化才可以编辑valueOld = self.data(index, Qt.DisplayRole)if valueOld == value:return False# 获取目标行列值primaryKeyIndex = QSqlQueryModel.index(self, index.row(), ID)id = self.data(primaryKeyIndex, role)fieldName = self.record().fieldName(index.column())# 修改行列ok = self.setSqlData(id, fieldName, value)# 更新视图self.editSignal.emit()return okdef setSqlData(self, id: int, fieldName: str, value: str):query = QSqlQuery()_str = f"update student set {fieldName} = '{value}' where id = {id}"return query.exec(_str)# QSpinBox自定义委托,适用于整数
class IntegerColumnDelegate(QStyledItemDelegate):def __init__(self, minimum=0, maximum=100, parent=None):super(IntegerColumnDelegate, self).__init__(parent)self.minimum = minimumself.maximum = maximumdef createEditor(self, parent: QWidget, option: QStyleOptionViewItem, index: QModelIndex):spinbox = QSpinBox(parent)spinbox.setRange(self.minimum, self.maximum)spinbox.setAlignment(Qt.AlignRight | Qt.AlignVCenter)return spinboxdef setEditorData(self, editor: QSpinBox, index: QModelIndex):value = int(index.model().data(index, Qt.DisplayRole))editor.setValue(value)def setModelData(self, editor: QSpinBox, model: QAbstractItemModel, index: QModelIndex):editor.interpretText()model.setData(index, editor.value())class SqlQueryModelDemo(QWidget):def __init__(self):super().__init__()self.setWindowTitle("分页查询+使用自定义模型和委托实现编辑功能")self.resize(750, 300)# 创建窗口self.createWindow()# 设置表格self.setTableView()# 信号槽连接self.firstButton.clicked.connect(self.onFirstButtonClick)self.prevButton.clicked.connect(self.onPrevButtonClick)self.nextButton.clicked.connect(self.onNextButtonClick)self.lastButton.clicked.connect(self.onLastButtonClick)self.switchPageButton.clicked.connect(self.onSwitchPageButtonClick)# 上下文菜单self.menu = self.generateMenu()self.tableView.setContextMenuPolicy(Qt.CustomContextMenu)  ######允许右键产生子菜单self.tableView.customContextMenuRequested.connect(self.showMenu)  ####右键菜单# 创建窗口def createWindow(self):# 操作布局operatorLayout = QHBoxLayout()self.prevButton = QPushButton("前一页")self.nextButton = QPushButton("后一页")self.firstButton = QPushButton("第一页")self.lastButton = QPushButton("最后一页")self.switchPageButton = QPushButton("Go")self.switchPageLineEdit = QLineEdit()self.switchPageLineEdit.setValidator(QIntValidator(self))self.switchPageLineEdit.setFixedWidth(40)switchPage = QLabel("转到第")page = QLabel("页")operatorLayout.addWidget(self.firstButton)operatorLayout.addWidget(self.prevButton)operatorLayout.addWidget(self.nextButton)operatorLayout.addWidget(self.lastButton)operatorLayout.addWidget(switchPage)operatorLayout.addWidget(self.switchPageLineEdit)operatorLayout.addWidget(page)operatorLayout.addWidget(self.switchPageButton)operatorLayout.addWidget(QSplitter())# 状态布局statusLayout = QHBoxLayout()self.totalPageLabel = QLabel()self.totalPageLabel.setFixedWidth(70)self.currentPageLabel = QLabel()self.currentPageLabel.setFixedWidth(70)self.totalRecordLabel = QLabel()self.totalRecordLabel.setFixedWidth(70)statusLayout.addWidget(self.totalPageLabel)statusLayout.addWidget(self.currentPageLabel)statusLayout.addWidget(QSplitter())statusLayout.addWidget(self.totalRecordLabel)# 设置表格属性self.tableView = QTableView()# 表格宽度的自适应调整self.tableView.horizontalHeader().setStretchLastSection(True)# self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)# 创建界面mainLayout = QVBoxLayout(self)mainLayout.addLayout(operatorLayout)mainLayout.addWidget(self.tableView)mainLayout.addLayout(statusLayout)self.setLayout(mainLayout)# 设置表格def setTableView(self):# 声明查询模型# self.queryModel = QSqlQueryModel(self)self.editModel = CustomSqlModel()# 设置当前页self.currentPage = 1# 每页显示记录数self.PageRecordCount = 10# 得到总记录数self.totalRecrodCount = self.getTotalRecordCount()# 得到总页数self.totalPage = int(self.totalRecrodCount / self.PageRecordCount + 0.5)# 设置总页数文本self.totalPageLabel.setText("总共%d页" % self.totalPage)# 设置总记录数self.totalRecordLabel.setText("共%d条" % self.totalRecrodCount)# 设置模型self.tableView.setModel(self.editModel)# 显示首页数据self.recordQuery(0)# 刷新状态self.updateStatus()# 设置表头self.editModel.setHeaderData(ID, Qt.Horizontal, "编号")self.editModel.setHeaderData(NAME, Qt.Horizontal, "姓名")self.editModel.setHeaderData(SUBJECT, Qt.Horizontal, "科目")self.editModel.setHeaderData(SEX, Qt.Horizontal, "性别")self.editModel.setHeaderData(AGE, Qt.Horizontal, "年纪")self.editModel.setHeaderData(SCORE, Qt.Horizontal, "成绩")self.editModel.setHeaderData(DESCRIBE, Qt.Horizontal, "说明")# 对特定行列进行委托# 设置委托,并设置可以调节的大小self.ageDelegate = IntegerColumnDelegate(16,40)self.tableView.setItemDelegateForColumn(AGE, self.ageDelegate)self.scoreDelegate = IntegerColumnDelegate(60,100)self.tableView.setItemDelegateForColumn(SCORE, self.scoreDelegate)self.editModel.editSignal.connect(self.onEditSingal)print('totalRecrodCount=' + str(self.totalRecrodCount))print('totalPage=' + str(self.totalPage))# 设置上下文菜单def generateMenu(self):menu = QMenu(self)menu.addAction(QIcon("images/up.png"), '第一页', self.onFirstButtonClick, QKeySequence(Qt.CTRL | Qt.Key_F))menu.addAction(QIcon("images/left.png"), '前一页', self.onPrevButtonClick, QKeySequence(Qt.CTRL | Qt.Key_P))menu.addAction(QIcon("images/right.png"), '后一页', self.onNextButtonClick, QKeySequence(Qt.CTRL | Qt.Key_N))menu.addAction(QIcon("images/down.png"), '最后一页', self.onLastButtonClick, QKeySequence(Qt.CTRL | Qt.Key_L))menu.addSeparator()menu.addAction('全选', lambda: self.tableView.selectAll(), QKeySequence(Qt.CTRL | Qt.Key_A))menu.addAction('选择行', lambda: self.tableView.selectRow(self.tableView.currentIndex().row()),QKeySequence(Qt.CTRL | Qt.Key_R))menu.addAction('选择列', lambda: self.tableView.selectColumn(self.tableView.currentIndex().column()),QKeySequence(Qt.CTRL | Qt.SHIFT | Qt.Key_R))return menudef showMenu(self, pos):self.menu.exec(QCursor.pos())  # 显示菜单# 得到记录数def getTotalRecordCount(self):self.editModel.setQuery('select count(*) from rmu')rowCount = self.editModel.record(0).value(0)print('rowCount=' + str(rowCount))return rowCount# 记录查询def recordQuery(self, limitIndex):szQuery = ("select * from student limit %d,%d" % (limitIndex, self.PageRecordCount))print('query sql=' + szQuery)self.editModel.setQuery(szQuery)# 刷新状态def updateStatus(self):szCurrentText = "当前第%d页" % self.currentPageself.currentPageLabel.setText(szCurrentText)# 设置按钮是否可用if self.currentPage == 1:self.firstButton.setEnabled(False)self.prevButton.setEnabled(False)self.nextButton.setEnabled(True)self.lastButton.setEnabled(True)elif self.currentPage >= self.totalPage - 1:self.firstButton.setEnabled(True)self.prevButton.setEnabled(True)self.nextButton.setEnabled(False)self.lastButton.setEnabled(False)else:self.firstButton.setEnabled(True)self.prevButton.setEnabled(True)self.nextButton.setEnabled(True)self.lastButton.setEnabled(True)# 第一页按钮按下def onFirstButtonClick(self):print('*** onFirstButtonClick ')self.recordQuery(0)self.currentPage = 1self.updateStatus()# 前一页按钮按下def onPrevButtonClick(self):print('*** onPrevButtonClick ')limitIndex = (self.currentPage - 2) * self.PageRecordCountself.recordQuery(limitIndex)self.currentPage -= 1self.updateStatus()# 后一页按钮按下def onNextButtonClick(self):print('*** onNextButtonClick ')limitIndex = self.currentPage * self.PageRecordCountself.recordQuery(limitIndex)self.currentPage += 1self.updateStatus()# 最后一页按钮按下def onLastButtonClick(self):print('*** onLastButtonClick ')limitIndex = (self.totalPage - 1) * self.PageRecordCountself.recordQuery(limitIndex)self.currentPage = self.totalPageself.updateStatus()# 转到页按钮按下def onSwitchPageButtonClick(self):# 得到输入字符串szText = self.switchPageLineEdit.text()# 是否为空if szText == '':QMessageBox.information(self, "提示", "请输入跳转页面")return# 得到页数pageIndex = int(szText)# 判断是否有指定页if pageIndex > self.totalPage or pageIndex < 1:QMessageBox.information(self, "提示", "没有指定的页面,请重新输入")return# 得到查询起始行号limitIndex = (pageIndex - 1) * self.PageRecordCount# 记录查询self.recordQuery(limitIndex)# 设置当前页self.currentPage = pageIndex# 刷新状态self.updateStatus()def onEditSingal(self):print('*** onEditSingal ')limitIndex = (self.currentPage - 1) * self.PageRecordCountself.recordQuery(limitIndex)self.updateStatus()if __name__ == '__main__':app = QApplication(sys.argv)db = QSqlDatabase.addDatabase('QSQLITE')db.setDatabaseName('./drurmu.db')if db.open() is not True:QMessageBox.critical(QWidget, 'open error', '数据库打开失败')exit()demo = SqlQueryModelDemo()demo.show()sys.exit(app.exec())

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/106669.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

专业144,总分440+,上岸西北工业大学827西工大信号与系统考研经验分享

我的初试备考从4月末&#xff0c;持续到初试前&#xff0c;这中间没有中断。 总的时间分配上&#xff0c;是数学>专业课>英语>政治&#xff0c;虽然大家可支配时间和基础千差万别&#xff0c;但是这么分配是没错的。 数学 时间安排&#xff1a;3月-7月&#xff1a;…

人声分离软件:iZotope RX 10 (WinMac) 中文汉化版

iZotope RX 10是一款在音频修复和增强领域中非常出色的软件。它提供了一套全面的音频问题解决方案&#xff0c;为后期制作专业人员、音频工程师和视频编辑者解决各种棘手问题。 iZotope RX 10的主要特点包括&#xff1a; 声音修复功能&#xff1a;可以去除不良噪音、杂音、吱吱…

使用Python,Xpath获取所有的漫画章节路径,并下载漫画图片生成单个/多个pdf,并进行pdf合并

使用Python&#xff0c;Xpath获取所有的漫画章节路径&#xff0c;并下载漫画图片生成单个/多个pdf&#xff0c;并进行pdf合并 1 效果图2 原理2.1 pa_mh.py获取喜欢的漫画及所有章节2.2 pyImg2pdf.py根据图片生成单个/多个pdf并增加章节提示 3 源码3.1 pa_mh.py获取喜欢的漫画及…

python的pyecharts第三方模块绘制高端统计图表

pyecharts库 python的pyecharts库是一个用于生成 Echarts 图表的python第三方类库&#xff0c;可以绘制很高端的统计图表以便展示数据。 安装方法 pip安装 pip install pyecharts或者github拉取下载安装 git clone https://github.com/pyecharts/pyecharts.git cd pyechar…

业务安全五重价值:防攻击、保稳定、助增收、促合规、提升满意度

目录 防范各类威胁攻击 保障业务的连续性和稳定性 保障业务的合规性 提升企业营收和发展 提升企业满意度和品牌知名度 2023年暑假被“票贩子”和“黄牛”攻陷。他们利用各种手段抢先预约名额&#xff0c;然后加价出售给游客&#xff0c;导致了门票供不应求的局面&#xff…

win11的右键菜单改成win10的样子

在终端复制一下命令 reg add “HKCU\Software\Classes\CLSID{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32” /f /ve 回车&#xff0c;会显示成功 再重启资源管理器。这步必须执行&#xff0c;否则是成功的&#xff0c;或者可能重启电脑会成功&#xff0c;但是我没有…

Apache Tomcat下载安装配置使用超详细

下载安装 tomcat官网 在此我们以Tomcat 9.0.81为例&#xff0c;点击下载压缩包&#xff0c;解压到自己的文件夹。 tar.gz是linux操作系统下的安装版本。zip是windows系统下的压缩版本。Windows Service Installer是windows操作系统下的exe安装版本。 检查是否配置JDK 1.…

ARM架构的基本知识

ARM两种授权 体系结构授权, 一种硬件规范, 用来约定指令集, 芯片内部体系结构(内存管理, 高速缓存管理), 只约定每一条指令的格式, 行为规范, 参数, 客户根据这个规范自行设计与之兼容的处理器处理IP授权, ARM公司根据某个版本的体系结构设计处理器, 再把处理器设计方案授权给…

【广州华锐互动】塔吊多人安拆VR互动培训系统

塔吊多人安拆VR互动培训系统由广州华锐互动制作&#xff0c;是一种基于VR技术的模拟实训系统&#xff0c;专门用于培训塔吊驾驶员和操作员。 在现实生活中&#xff0c;塔吊操作具有一定的危险性&#xff0c;尤其是在培训过程中容易发生意外。而使用VR互动实训系统&#xff0c;学…

项目平台——测试报表的实现(六)

这里写目录标题 一、页面成果图展示二、代码逻辑1、接口封装2、发送接口请求 三、样式设计1、element-plus中表格组件的使用 四、总体代码五、问题解决六、项目首页【执行记录】设计1、导入子组件2、注册子组件3、使用子组件 一、页面成果图展示 二、代码逻辑 1、接口封装 ap…

【C++初阶(二)缺省参数与函数重载】

本专栏内容为&#xff1a;C学习专栏&#xff0c;分为初阶和进阶两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握C。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;C &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&…

SpringMVC的拦截器(Interceptor)

拦截器简介 SpringMVC的拦截器Interceptor&#xff0c;主要是对Controller资源访问时进行拦截的基本操作的技术&#xff0c;当然拦截后可以进行权限控制&#xff0c;功能增强等都是可以的。拦截器类似于JavaWeb开发中的Filter&#xff0c;他们之间的区别如下图所示 Filter技术…

当GDB遇到STL

STL是标准模板库&#xff08;Standard Template Library&#xff09;的简称&#xff0c;是C的三大件之一。 ‍‍ Alex是STL的核心设计者。他于1950年出生在莫斯科&#xff0c;后来到美国发展&#xff0c;曾经在Adobe、A9.com等公司工作。在Adobe工作时&#xff0c;他和保罗•麦…

参数解析(牛客)

目录 一、题目 二、代码 一、题目 二、代码 #include <iostream> #include <vector> using namespace std;int main() {string s;getline(cin, s);int i 0;vector<string>ret;while (i < s.size()){if (s[i] )//遇到空格直接跳过{i;}else if (s[i] …

Fbank及MFCC学习

Fbank&#xff1a;FilterBank&#xff1a;人耳对声音频谱的响应是非线性的&#xff0c;Fbank就是一种前端处理算法&#xff0c;以类似于人耳的方式对音频进行处理&#xff0c;可以提高语音识别的性能。获得语音信号的fbank特征的一般步骤是&#xff1a;预加重、分帧、加窗、短时…

day14I102.二叉树的层序遍历

1、102.二叉树的层序遍历 题目链接&#xff1a;https://leetcode.cn/problems/binary-tree-level-order-traversal/ 文章链接&#xff1a;https://programmercarl.com/0102.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E5%B1%82%E5%BA%8F%E9%81%8D%E5%8E%86.html#%E7%AE%97%E6%B3%95…

详细教程:Postman 怎么调试 WebSocket

WebSocket 是一个支持双向通信的网络协议&#xff0c;它在实时性和效率方面具有很大的优势。Postman 是一个流行的 API 开发工具&#xff0c;它提供了许多功能来测试和调试 RESTful API 接口&#xff0c;最新的版本也支持 WebSocket 接口的调试。想要学习更多关于 Postman 的知…

PDE数值解中,为什么要引入弱解(weak solution)的概念?

See https://www.zhihu.com/question/24243246?utm_sourceqq&utm_mediumsocial&utm_oi1315073218793488384

[Python]黑色背景白色块滑动视频

黑色背景白色块滑动视频&#xff0c;单帧效果如下&#xff1a; 配置参数 1920 1080 400 400 300 60 1920x1080.avi import numpy as np import cv2 as cv import os import syswidth 1920 height 1080 rect_szx 400 rect_szy 300 sz_y_init 400 fps 24width int(sys.a…

竞赛选题 深度学习+opencv+python实现车道线检测 - 自动驾驶

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV56 数据集处理7 模型训练8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &am…