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

相关文章:
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…...
【操作系统】磁臂黏着现象
文章目录 什么是磁臂黏着?为什么 FCFS(First Come First Service) 可以避免磁臂黏着?为什么 scan,cscan 会产生磁臂黏着?为什么 NsetpScan 可以避免磁臂黏着?NScan 原理简介NScan 避免磁臂黏着的…...
面试题-React(十二):React中不可变数据的力量
一、不可变数据的概念 不可变数据意味着数据一旦创建,就不能被更改。在React中,每次对数据的修改都会返回一个新的数据副本,而不会改变原始数据。这种方式确保了数据的稳定性和一致性。 二、Props中的不可变数据 在React中,组件…...
conda 创建虚拟环境
1.为什么要创建虚拟环境 我们在做开发或者跑论文实验可能会同时进行多个任务,这些任务可能会依赖于不同的python环境,比如有的用到3.6有的用到3.7,这时我们创建不同版本的python,放到虚拟环境中给不同的任务分别提供其所需要的版本…...
Java的HTML转义工具
引言 在开发web应用程序时,我们经常需要处理用户输入的数据并将其显示在网页上。然而,用户输入的数据可能包含HTML标签或特殊字符,如果直接在网页上显示这些数据,会导致XSS攻击或显示错误的结果。为了解决这个问题,我…...
Flask (Jinja2) 服务端模板注入漏洞复现
文章目录 Flask (Jinja2) 服务端模板注入漏洞1.1 漏洞描述1.2 漏洞原理1.3 漏洞危害1.4 漏洞复现1.4.1 漏洞利用 1.5 漏洞防御 Flask (Jinja2) 服务端模板注入漏洞 1.1 漏洞描述 说明内容漏洞编号漏洞名称Flask (Jinja2) 服务端模板注入漏洞漏洞评级高危影响版本使用Flask框架…...
file_get_contents 与curl 的对比
在讲区别前大家对file_get_contents 只是停留在get 方法其实file_get_contents也可以进行post请求该方法如下 $content []; $options array(http > array(method > POST,// header 需要设置为 JSONheader > Content-type:application/json,content > json_en…...
两个el-date-picker进行互相关联
elementui两个el-date-picker进行互相关联_element-ui两个时间控件进行联动_沈清秋.的博客-CSDN博客...
python openai playground使用教程
文章目录 playground介绍Playground特点模型设置和参数选择四种语言模型介绍 playground应用构建自己的playground应用playground python使用 playground介绍 OpenAI Playground是一个基于Web的工具,旨在帮助开发人员测试和尝试OpenAI的语言模型,如GPT-…...
DOCKER本地仓库
概述 随着docker的应用越来越多,安装部署越来越方便,批量自动化的镜像生成和发布都需要docker仓库的本地化应用。 试用了docker的本地仓库功能,简单易上手,记录下来以备后用。 环境 centos:CentOS release 7.0 (F…...
python写着玩
摄氏温度转化为华氏温度 #摄氏温度转化为华氏温度 celsius float(input("请输入摄氏度:")) fahrenheit(9/5)*celsius32 print("华氏温度是%.1f"%fahrenheit) 计算圆柱体的体积 #计算圆柱体的体积 radius , length map( float,input("请…...
K8s Kubernetes Namespave Pod Label Deployment Service 实战
本章节将介绍如何在kubernetes集群中部署一个nginx服务,并且能够对其进行访问。 Namespace Namespace是kubernetes系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。 默认情况下,kubernetes集群中…...
SpringBoot使用随机端口启动
1.获取可用端口工具类 import java.net.InetAddress; import java.net.Socket; import java.util.Random;public class ServerPortUtil {private static final int MAX_PORT 65535;private static final int MIN_PORT 8000;public static String getAvailablePort() {Random…...
NewStarCTF2023week2-ez_sql
闭合之后尝试判断字段数,存在WAF,使用大小写绕过(后面的sql语句也需要进行大小写绕过) ?id1 Order by 5-- 测出有5列 ?id1 Order by 6-- 查一下数据库名、版本、用户等信息 ?id1Union Select database(),version(),user(),4,…...
力扣-434.字符串中的单词数
Idea 利用C中的 stringstream 指定字符分割字符串 class Solution { public:int countSegments(string s) {int cnt 0;stringstream ss(s);string word;while(ss >> word){cnt;}return cnt;} };...
【ALO-BP预测】基于蚁狮算法优化BP神经网络回归预测研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
分布式存储系统Ceph应用详解
Ceph的应用 一、Ceph 存储池(Pool)1.1 Ceph存储池的基本概念1.2 原理1.3 一个Pool资源池应该包含多少PG数?1.4 Ceph 存储池相关管理命令1.4.1 创建1.4.2 查看1.4.3 修改1.4.4 删除 二、 CephFS文件系统MDS接口三、创建CephFS文件系统MDS接口3.1 服务端操作Step1 在管…...
人工智能轨道交通行业周刊-第63期(2023.10.9-10.15)
本期关键词:一体化智慧列车运行系统、车辆数字化运维管理、智能传感器、PHM、LKJ 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetro…...
OJ项目——统一数据格式返回,我是如何处理的?
目录 前言 OJ项目中是如何处理的 1、准备一个类,作为统一的数据返回格式 2、准备一个类,实现ResponseBodyAdvice接口 3、我们如何写返回值更好 4、进一步优化返回值 小结 前言 关于SpringBoot的同一功能处理,本博主在这篇博客已经有介…...
Open CV 3D Python 环境搭建
1、安装Windows-Python环境 下载exe 并安装 https://python.p2hp.com/downloads/windows/index.html 安装路径随意, 基本一路默认,下一步、下一步 注意有个钩:添加到环境变量 检测是否成功安装Python 环境 CMD输入python 2、安装OpenCV -Python 包来自清华大学…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
