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

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&#xf…...

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。在…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

浅谈不同二分算法的查找情况

二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况&#xf…...

【笔记】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 官方安…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...

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

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