当前位置: 首页 > news >正文

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 操作练习

代码摘自&#xff0c;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…...

【操作系统】磁臂黏着现象

文章目录 什么是磁臂黏着&#xff1f;为什么 FCFS&#xff08;First Come First Service&#xff09; 可以避免磁臂黏着&#xff1f;为什么 scan&#xff0c;cscan 会产生磁臂黏着&#xff1f;为什么 NsetpScan 可以避免磁臂黏着&#xff1f;NScan 原理简介NScan 避免磁臂黏着的…...

面试题-React(十二):React中不可变数据的力量

一、不可变数据的概念 不可变数据意味着数据一旦创建&#xff0c;就不能被更改。在React中&#xff0c;每次对数据的修改都会返回一个新的数据副本&#xff0c;而不会改变原始数据。这种方式确保了数据的稳定性和一致性。 二、Props中的不可变数据 在React中&#xff0c;组件…...

conda 创建虚拟环境

1.为什么要创建虚拟环境 我们在做开发或者跑论文实验可能会同时进行多个任务&#xff0c;这些任务可能会依赖于不同的python环境&#xff0c;比如有的用到3.6有的用到3.7&#xff0c;这时我们创建不同版本的python&#xff0c;放到虚拟环境中给不同的任务分别提供其所需要的版本…...

Java的HTML转义工具

引言 在开发web应用程序时&#xff0c;我们经常需要处理用户输入的数据并将其显示在网页上。然而&#xff0c;用户输入的数据可能包含HTML标签或特殊字符&#xff0c;如果直接在网页上显示这些数据&#xff0c;会导致XSS攻击或显示错误的结果。为了解决这个问题&#xff0c;我…...

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的工具&#xff0c;旨在帮助开发人员测试和尝试OpenAI的语言模型&#xff0c;如GPT-…...

DOCKER本地仓库

概述 随着docker的应用越来越多&#xff0c;安装部署越来越方便&#xff0c;批量自动化的镜像生成和发布都需要docker仓库的本地化应用。 试用了docker的本地仓库功能&#xff0c;简单易上手&#xff0c;记录下来以备后用。 环境 centos&#xff1a;CentOS release 7.0 (F…...

python写着玩

摄氏温度转化为华氏温度 #摄氏温度转化为华氏温度 celsius float(input("请输入摄氏度&#xff1a;")) fahrenheit(9/5)*celsius32 print("华氏温度是%.1f"%fahrenheit) 计算圆柱体的体积 #计算圆柱体的体积 radius , length map( float,input("请…...

K8s Kubernetes Namespave Pod Label Deployment Service 实战

本章节将介绍如何在kubernetes集群中部署一个nginx服务&#xff0c;并且能够对其进行访问。 Namespace Namespace是kubernetes系统中的一种非常重要资源&#xff0c;它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。 默认情况下&#xff0c;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

闭合之后尝试判断字段数&#xff0c;存在WAF&#xff0c;使用大小写绕过&#xff08;后面的sql语句也需要进行大小写绕过&#xff09; ?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代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

分布式存储系统Ceph应用详解

Ceph的应用 一、Ceph 存储池(Pool)1.1 Ceph存储池的基本概念1.2 原理1.3 一个Pool资源池应该包含多少PG数&#xff1f;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)

本期关键词&#xff1a;一体化智慧列车运行系统、车辆数字化运维管理、智能传感器、PHM、LKJ 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetro…...

OJ项目——统一数据格式返回,我是如何处理的?

目录 前言 OJ项目中是如何处理的 1、准备一个类&#xff0c;作为统一的数据返回格式 2、准备一个类&#xff0c;实现ResponseBodyAdvice接口 3、我们如何写返回值更好 4、进一步优化返回值 小结 前言 关于SpringBoot的同一功能处理&#xff0c;本博主在这篇博客已经有介…...

Open CV 3D Python 环境搭建

1、安装Windows-Python环境 下载exe 并安装 https://python.p2hp.com/downloads/windows/index.html 安装路径随意, 基本一路默认,下一步、下一步 注意有个钩&#xff1a;添加到环境变量 检测是否成功安装Python 环境 CMD输入python 2、安装OpenCV -Python 包来自清华大学…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

实战三:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用&#xff0c;用户可以通过网页界面上传黑白视频&#xff0c;系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观&#xff0c;不需要了解技术细节。 效果图 ​二、实现思路 总体思路&#xff1a; 用户通过Gradio界面上…...

用鸿蒙HarmonyOS5实现中国象棋小游戏的过程

下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...

五子棋测试用例

一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏&#xff0c;有着深厚的文化底蕴。通过将五子棋制作成网页游戏&#xff0c;可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家&#xff0c;都可以通过网页五子棋感受到东方棋类…...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁

赛门铁克威胁猎手团队最新报告披露&#xff0c;数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据&#xff0c;严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能&#xff0c;但SEMR…...