PyQt5数据库开发1 4.3 QSqlTableModel 之 相关槽函数的实现(多图长文详解)
目录
一、打开数据库表
1. 写打开数据库的槽函数
2. 运行后发现数据库可以打开了
3. ODBC配通了,数据库还是打不开
4. 写在tableView上显示数据库表的函数
5. 运行后发现表可以显示了
6. 代码分析
7. 添加列名称
8. 根据内容调整列宽
9. 备注:数据库连接串
二、建立tableview与右侧组件的关联
1. 当前无关联
2. 添加关联代码
3. 运行程序
4. 添加选择行变化的信号与槽函数
5. 运行程序
6. 发现tableView可以选择多行
7. 添加代码,限制tableView
8. 运行程序,发现没法选多行了
三、排序
1. 排序下拉框没内容
2. 补充相关函数和调用
3. 运行程序,发现排序下拉框有内容了
4. 排序下拉框的信号与槽
5. 添加槽函数
6. 运行程序
7. 升序和降序两个单选按钮的信号与槽函数
8. 添加槽函数
9. 运行测试升序降序功能
四、数据过滤
1. 添加槽函数
2. 测试过滤功能
3. 发现bug
4. 去Qt修改
5. 运行程序
6. 添加代码,让数据库打开时,排序和过滤功能能用
7. 运行程序
五、工具按钮状态
1. 当前工具按钮状态
2. 添加改变按钮状态的代码
3. 运行程序
六、涨工资按钮
1. 涨工资代码
2. 去数据库查一下原始数据
3. 运行程序
4. 去数据库查一下现在的数据
5. 代码分析
七、删除、保存、取消按钮
1. 删除按钮代码
2. 运行程序
3. 去数据库里面查,发现数据还在
4. 添加保存和取消代码
5. 运行程序
6. 添加模型相关代码
7. 测试取消按钮
8. 测试保存按钮
八、数据的修改
1. 修改前数据
2. 修改数据
九、tableview里数据的修改
1. bug
2. 自定义代理组件
3. 修改代码,添加自定义组件
4. 运行程序,发现tableview里面的变化
十、添加和插入按钮
1. 添加代码
2. 测试添加功能
3. 测试插入功能
一、打开数据库表
1. 写打开数据库的槽函数
在qt上的actOpenDB这个action上点击右键,选择转到槽

选择triggered信号

复制函数名

在myMainWindow.py中添加函数

2. 运行后发现数据库可以打开了

3. ODBC配通了,数据库还是打不开
如果ODBC配通了,数据库还是打不开,可以考虑将连接串里面的localhost换成
(1)127.0.0.1
(2)主机名
4. 写在tableView上显示数据库表的函数
添加相应的import模块


5. 运行后发现表可以显示了
虽然很难看

6. 代码分析
self.DB是连接上的数据库
![]()
tableModel是PyQt5预定义的数据模型,用来作为数据库中一个数据库表的数据模型。

PyQt5使用Model/View结构来处理界面与数据。
Model从源数据提取需要的数据,用于视图组件进行显示和编辑
![]()
7. 添加列名称
插入红框中的代码
运行后可以看到表头信息出来了
8. 根据内容调整列宽
列太宽了,很难看。加多这条语句

输出结果好看多了
9. 备注:数据库连接串
也可以这么写
二、建立tableview与右侧组件的关联
1. 当前无关联
当前tableview里面选择某个行,右侧是无反应的


2. 添加关联代码
同时import若干新模块
插入

3. 运行程序
发现右边groupbox出现第一条数据。无论左边tableview点哪个单元格,右边的groupbox都不跟着变化

4. 添加选择行变化的信号与槽函数

5. 运行程序

换个地方点击

6. 发现tableView可以选择多行
按住Ctrl键,在多条记录上选择,发现可以选多行

7. 添加代码,限制tableView
在__init__函数中限制

8. 运行程序,发现没法选多行了

三、排序
1. 排序下拉框没内容

当前这个下拉框里面是没东西的,运行的时候点没反应
2. 补充相关函数和调用

3. 运行程序,发现排序下拉框有内容了

4. 排序下拉框的信号与槽



5. 添加槽函数
import新模块

添加红色框框内代码。注意要在前面写上@pyqtSlot(int),说明其参数为int类型

6. 运行程序

换一种排序方式

7. 升序和降序两个单选按钮的信号与槽函数


升序
降序
8. 添加槽函数

9. 运行测试升序降序功能

四、数据过滤
1. 添加槽函数

2. 测试过滤功能



3. 发现bug


原因是这些按钮在数据库没打开时不应该能按。排序相关功能也有类似的错误
4. 去Qt修改

将groupBoxSort的enabled属性里面的勾去掉

同样,将groupBoxFilter的相关属性也去掉

保存,退出qt

在Eric6工程目录下运行批处理文件或者将form文件拷贝到Eric6工程目录,然后在Eric6下编译form(因为改动没有涉及资源,所以直接在eric6下编译form就行了)

5. 运行程序
现在数据库没打开时,排序和过滤相应按钮都没法按了

6. 添加代码,让数据库打开时,排序和过滤功能能用
在opentable函数的最后加入如下代码

7. 运行程序
打开数据库以后,排序和过滤按钮能用了
五、工具按钮状态
1. 当前工具按钮状态
打开数据库后,打开按钮不应该还能用,不能多次重复打开数据库。而添加、插入、删除、涨工资、保存、修改等按钮应该变成有效状态,可以让人点击才对
2. 添加改变按钮状态的代码

3. 运行程序
数据库打开后,添加、插入、删除、涨工资相关按钮能按了。保存和取消按钮现在还不能按,改了数据后才能按。

六、涨工资按钮
1. 涨工资代码


2. 去数据库查一下原始数据

3. 运行程序
按涨工资键前

按涨工资键后


都涨了10%
4. 去数据库查一下现在的数据

数据全改了
5. 代码分析

七、删除、保存、取消按钮
1. 删除按钮代码

2. 运行程序

点完后,界面变成了这样

3. 去数据库里面查,发现数据还在

为什么没删掉,没有submit
4. 添加保存和取消代码

5. 运行程序

点删除后,发现这两个按钮还是不能按

当前鼠标换别的数据行试试

6. 添加模型相关代码
在opentable函数这里,添加一行

补充槽函数

7. 测试取消按钮
删除完之后,换别的单元格,发现保存和取消按钮可以用了。这是因为触发了do_currentChanged

先点取消按钮
点完后
到底删掉没有?点一下全显示按钮

数据回来了,取消删除成功
去数据库里面查一查,数据还在

8. 测试保存按钮
删除华筝的记录后,点保存按钮

输出
去数据库里查一查

八、数据的修改
1. 修改前数据

2. 修改数据
将黄蓉的工资改为200,出生日期改为4月29日,备注也改一下

点完后
按一下取消键,数据行变回原样
再改一次,这次按保存键
查询数据库,发现数据被改了
改一下黄蓉的性别和省份,按保存
数据库里查查,改掉了
![]()
九、tableview里数据的修改
1. bug
在右边的groupbox里的数据修改没问题,在左边的tableview里面修改就有问题

弹出修改框,随便乱改,变成下面的样子

按保存,去数据库里面查,发现已经把性别改成了不合理的数据X

在右侧的groupbox里,由于限制了性别只能去男和女,所以显示不出来X
要解决这个问题,要对tableview里面数据的修改进行限制
2. 自定义代理组件
tableview默认的单元格编辑组件是QlineEdit,对输入的数据无法限制。可以为某列设置自定义代理组件,比如QcommoBox。在上面的bug中,希望把性别的编辑组件改成QcommoBox,只能选择某些项(比如男和女),而不能随便输入。
新建文件myDelegates.py,创建一个


3. 修改代码,添加自定义组件

在opentable函数中插入红色框框中的代码
4. 运行程序,发现tableview里面的变化

十、添加和插入按钮
1. 添加代码
import模块

插入红色框框部分代码
2. 测试添加功能


查数据库,新记录出现了
3. 测试插入功能

查查数据库,新纪录出现。数据库语句没有排序字段,所以新纪录出现在最后

相关文章:
PyQt5数据库开发1 4.3 QSqlTableModel 之 相关槽函数的实现(多图长文详解)
目录 一、打开数据库表 1. 写打开数据库的槽函数 2. 运行后发现数据库可以打开了 3. ODBC配通了,数据库还是打不开 4. 写在tableView上显示数据库表的函数 5. 运行后发现表可以显示了 6. 代码分析 7. 添加列名称 8. 根据内容调整列宽 9. 备注:…...
QT 设计一个串口调试工具,用一个工程就能轻松解决,外加虚拟串口工具模拟调试,在日常工作中可类比模块间通信,非常详细建议收藏
QT 串口调试工具第一节 虚拟串口工具安装第二节 QT创建一个基于QWidget的项目第三节 UI界面设计第三节 项目头文件widget.h第四节 项目实现文件widget.cpp第五节 main函数第六节 编译结果重点第七节 使用QT打包程序,不安装QT的电脑可使用第一节 虚拟串口工具安装 -…...
OpenSumi 是信创开发云的首选
原文作者:行云创新技术总监 邓冰寒 引言 随着云原生应用的日益普及,开发上云也逐步被越来越多的厂商和开发者接受,在这个赛道国内外有不少玩家,国外的 GitHub Codespaces、CodeSandbox,GitPod、亚马逊 Cloud9…...
JdbcTemplate常用方法解析
文章目录1.JdbcTemplate简介2.JdbcTemplate主要方法:3.常用方法介绍update()方法增删改query()查询方法1.JdbcTemplate简介 JdbcTemplate是Spring JDBC的核心类,借助该类提供的方法可以很方便的实现数据的增删改查。 Spring对数据库的操作在jdbc上面做…...
生物素标记试剂1869922-24-6,Alkyne-PEG3-Biotin PC,炔烃PEG3生物素PC
1、试剂基团反应特点(Reagent group reaction characteristics):PC alkyne-PEG3-Biotin含一个炔烃和一个 PEG 链接的可光裂解生物素基团。含 3 个单元 PEG 的 ADC linker,生物素本身是个游离的小分子,在生物实验中常常…...
CS224W课程学习笔记(三):DeepWalk算法原理与说明
引言 什么是图嵌入? 图嵌入(Graph Embedding,也叫Network Embedding) 是一种将图数据(通常为高维稠密的矩阵)映射为低微稠密向量的过程,能够很好地解决图数据难以高效输入机器学习算法的问题。…...
rk3568 开发板Ubuntu系统说明
Ubuntu MinimalUbuntu Minimal系统基于Ubuntu 64bit系统构建,目前发布有Ubuntu18.04这个版本。与Ubuntu Desktop 相比具有以下特性:没有桌面环境,占用资源少,在简化网络管理之后,只需40M内存;针对嵌入式平台…...
Windows和Linux常用HASH算法使用命令
Windows和Linux常用hash算法使用命令 Windows,以文件xxx.zip为例 Windows 求文件 md5 certutil -hashfile xxx.zip md5Windows 求文件 sha1 certutil -hashfile xxx.zip sha1Windows 求文件 sha256 certutil -hashfile xxx.zip sha256Linux,以文件xxx.z…...
货仓选址 AcWing(JAVA)
在一条数轴上有 N家商店,它们的坐标分别为 A1∼AN。 现在需要在数轴上建立一家货仓,每天清晨,从货仓到每家商店都要运送商品。 为了提高效率,求把货仓建在何处,可以使得货仓到每家商店的距离之和最小。 输入格式&#…...
SPI+DMA传输性能比较
本文章仅仅简单记录32单片机的SPIDMA驱动显示屏的性能测试,这里不花费时间介绍SPI和DMA。 硬件材料:SPI显示屏一个,32单片机 软件材料: 1.LCD的SPI驱动显示程序(SPI / SPIDMA): (1&a…...
Centos7系统编译Hadoop3.3.4
1、背景 最近在学习hadoop,此篇文章简单记录一下通过源码来编译hadoop。为什么要重新编译hadoop源码,是因为为了匹配不同操作系统的本地库环境。 2、编译源码 2.1 下载并解压源码 [roothadoop01 ~]# mkdir /opt/hadoop [roothadoop01 ~]# cd /opt/had…...
pb并发控制
并发控制(一) 并发能力是指多用户在同一时间对相同数据同时访问的能力。一般的关系型数据库都具 有并发控制的能力,但是这种并发功能也会对数据的一致性带来危险。试想若有两个用 户都试图访问某个银行用户的记录并同时要求修改该用户的存款余额时,情况将会怎样 呢?我们可以…...
登录拦截器
文章目录前言一、interceptor1.interceptor 包下新建loginInterceptor.java2.config 包下新建 AdminWebConfig.java3.返回登录页面接收提示信息前言 本篇主要介绍spring框架里提供的 HandlerInterceptor 拦截器做登录拦截。 一、interceptor 1.interceptor 包下新建loginInte…...
STM32 - HAL库UART串口
1.串口初始化配置/******************************************************************************* Function: BSP_UART_Init Description: 串口初始化 Input: instance 串口号baudRate: 波特率 Output: 无 Return: 无 ************************************************…...
Vue3 的状态管理库(Pinia)
目录前言:一、什么是 Pinai二、安装与使用pinia三、什么是 store四、state1. 定义 state2. 组件中访问 state五、Getters1. 定义 Getters2. 在组件中使用 Getters六、Actions1. 定义Actions2. 组件中访问 Actions总结:前言: 在编写vue里的项目…...
信息系统项目管理师知识点汇总(2023最新)
信息系统项目管理师 信息系统项目管理师简介如何应对考试考试细节与学习 十大管理 十大管理四十七过程 信息化和信息系统 项目管理基础 项目整体管理 项目范围管理 项目进度管理 项目成本管理 项目质量管理 项目人力资源管理 项目沟通管理 项目干系人管理 项目风险…...
标题标题标题
图床(Typora uPic/PicGo 七牛云) 图床(Typora uPic/PicGo 七牛云) 笔者平时使用 Typora 编写 markdown 文档,文档中常常会放置图片,如果文档不需要分享的话,其实讲图片存放在本地就可以了…...
OKR学习总结二
总结 绩效管理不是进行事后管理,而是参与整个过程并进行实时把控。 我们将受益目标分为两个子目标: 新增收入和重复收入。第一部分目标由市场营销部承担,第二个目标则由产品部承担。 简而言之,文化是一系列价值观和信仰的体现&…...
MAC中docker搭建fastdfs
1:首先搭建Docker2:通过Docker搭建fastdfs(1)查找镜像打开终端通命令查找fastdfs的镜像docker search fastdfs(二)拉取镜像在找到合适的镜像后执行命令:docker pull delron/fastdfs(三) 创建storage和track…...
JavaScript 变量
变量是用于存储信息的"容器"。实例var x5;var y6;var zxy;尝试一下 就像代数那样x5y6zxy在代数中,我们使用字母(比如 x)来保存值(比如 5)。通过上面的表达式 zxy,我们能够计算出 z 的值为 11。在…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...
JS红宝书笔记 - 3.3 变量
要定义变量,可以使用var操作符,后跟变量名 ES实现变量初始化,因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符,可以创建一个全局变量 如果需要定义…...
webpack面试题
面试题:webpack介绍和简单使用 一、webpack(模块化打包工具)1. webpack是把项目当作一个整体,通过给定的一个主文件,webpack将从这个主文件开始找到你项目当中的所有依赖文件,使用loaders来处理它们&#x…...
GAN模式奔溃的探讨论文综述(一)
简介 简介:今天带来一篇关于GAN的,对于模式奔溃的一个探讨的一个问题,帮助大家更好的解决训练中遇到的一个难题。 论文题目:An in-depth review and analysis of mode collapse in GAN 期刊:Machine Learning 链接:...
路由基础-路由表
本篇将会向读者介绍路由的基本概念。 前言 在一个典型的数据通信网络中,往往存在多个不同的IP网段,数据在不同的IP网段之间交互是需要借助三层设备的,这些设备具备路由能力,能够实现数据的跨网段转发。 路由是数据通信网络中最基…...




















