PyQt5数据库开发1 4.3 QSqlTableModel 之 相关槽函数的实现(多图长文详解)

news2024/9/17 7:21:09

目录

一、打开数据库表

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. 测试插入功能

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

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

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

相关文章

Kaggle系列之CIFAR-10图像识别分类(残差网络模型ResNet-18)

CIFAR-10数据集在计算机视觉领域是一个很重要的数据集,很有必要去熟悉它,我们来到Kaggle站点,进入到比赛页面:https://www.kaggle.com/competitions/cifar-10CIFAR-10是8000万小图像数据集的一个子集,由60000张32x32彩…

spring cloud gateway集成sentinel并扩展支持restful api进行url粒度的流量治理

sentinel集成网关支持restful接口进行url粒度的流量治理前言使用网关进行总体流量治理(sentinel版本:1.8.6)1、cloud gateway添加依赖:2、sentinel配置3、网关类型项目配置4、通过zk事件监听刷新上报api分组信息1、非网关项目上报api分组信息…

I.MX6ULL_Linux_系统篇(16) uboot分析-启动流程

原文链接:I.MX6ULL_系统篇(16) uboot分析-启动流程 – WSY Personal Blog (cpolar.cn) 前面我们详细的分析了 uboot 的顶层 Makefile,了解了 uboot 的编译流程。本章我们来详细的分析一下 uboot 的启动流程,理清 uboot 是如何启动的。通过对 …

虹科资讯| 虹科AR荣获汽车后市场“20佳”维修工具评委会提名奖!

2022 虹科荣获20佳维修工具 评委会提名奖 特大喜讯,在2月16日《汽车维修与保养》杂志主办的第十八届汽车后市场“20佳”评选活动中,虹科的产品“M400智能AR眼镜”凭借在AR领域的专业实力,通过层层筛选,在102款入围产品中脱颖而出…

GIT:【基础三】Git工作核心原理

目录 一、Git本地四个工作区域 二、Git提交文件流程 一、Git本地四个工作区域 工作目录(Working Directory):电脑上存放开发代码的地方。暂存区(Stage/Index):用于l临时存放改动的文件,本质上只是一个文件,保存即将提交到文件列…

[ 对比学习篇 ] 经典网络模型 —— Contrastive Learning

🤵 Author :Horizon Max ✨ 编程技巧篇:各种操作小结 🏆 神经网络篇:经典网络模型 💻 算法篇:再忙也别忘了 LeetCode [ 对比学习篇 ] 经典网络模型 —— Contrastive Learning🚀 …

MongoDB介绍及使用教程

文章目录一、MongoDB介绍1. 什么是MongoDB2. 为什么要用MongoDB3. MongoDB的应用场景4. MongoDB基本概念二、MongoDB使用教程1.下载安装(Windows)2.MongoDB Conpass简单使用(选学)3.使用navicat连接MongoDB4.JAVA项目中使用MongoD…

JVM11 垃圾回收

1.1GC分类与性能指标 垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。 从不同角度分析垃圾收集器,可以将GC分为不同的类型。 Java不同版本新特性 语法层面:Lambda表达式、switch、自动拆箱装箱、enumAPI层面…

AI稳定生成图工业链路打造

前沿这篇文章会以比较轻松的方式,跟大家交流下如何控制文本生成图片的质量。要知道如何控制文本生成质量,那么我们首先需要知道我们有哪些可以控制的参数和模块。要知道我们有哪些控制的参数和模块,我们就得知道我们文本生成图片的这架机器或…

新手福利——x64逆向基础

一、x64程序的内存和通用寄存器 随着游戏行业的发展,x32位的程序已经很难满足一些新兴游戏的需求了,因为32位内存的最大值为0xFFFFFFFF,这个值看似足够,但是当游戏对资源需求非常大,那么真正可以分配的内存就显得捉襟…

测试人员如何运用好OKR

在软件测试工作中是不是还不知道OKR是什么?又或者每次都很害怕写OKR?或者总觉得很迷茫,不知道目标是什么? OKR 与 KPI 的区别 去年公司从KPI换OKR之后,我也有一段抓瞎的过程,然后自己找了两本书看,一本是《OKR工作法》&#xf…

WPF_ObservableCollection基本使用及其注意项

文章目录一、引言二、ObservableCollection三、结语一、引言 在GUI编程中经常会用到条目控件,常见的如ComboBox(下拉列表框),它内部往往有多个项。 在使用一些图形框架(Qt、WinForm)上进行原始开发时&…

安卓mvvm

AndroidX的意思是android extension libraries, 也就是安卓扩展包 AndroidX其实是Jetpack类库的命名空间 (190条消息) AndroidX初识_Neda Wang的博客-CSDN博客https://blog.csdn.net/weixin_38261570/article/details/111500044 viewmodel ViewModel类旨在以注重生命周期的方…

【机器学习】决策树-C4.5算法

1.C4.5算法 C4.5算法与ID3相似,在ID3的基础上进行了改进,采用信息增益比来选择属性。ID3选择属性用的是子树的信息增益,ID3使用的是熵(entropy, 熵是一种不纯度度量准则),也就是熵的变化值&…

回溯算法理论基础及组合问题

文章目录回溯算法理论基础什么是回溯法回溯法的效率回溯法解决的问题如何理解回溯法回溯法模板组合问题回溯算法理论基础 什么是回溯法 回溯法也可以叫做回溯搜索法,它是一种搜索的方式。 回溯是递归的副产品,只要有递归就会有回溯。 所以以下讲解中&…

LPWAN及高效弹性工业物联网核心技术方案

20多年前的一辆拖拉机就是一个纯机械的产品,里面可能并没有电子或者软件的构成;而随后随着软件的发展,拖拉机中嵌入了软件,它能控制发动机的功率及拖拉机防抱死系统;接下来,通过融入各种软件,拖…

js逆向基础篇-某房地产网站-登录

提示!本文章仅供学习交流,严禁用于任何商业和非法用途,如有侵权,可联系本文作者删除! 网站链接:aHR0cHM6Ly9tLmZhbmcuY29tL215Lz9jPW15Y2VudGVyJmE9aW5kZXgmY2l0eT1iag== 案例分析: 本篇文章分析的是登录逻辑。话不多说,先看看登录中有哪些加密参数,在登录页面随便输入…

K8S DNS解析过程和延迟问题

一、Linux DNS查询解析原理(对于调用glibc库函数gethostbyname的程序)我们在浏览器访问www.baidu.com这个域名,dns怎么查询到这台主机呢?  1、在浏览器中输入www.baidu.com域名,操作系统会先查找本地DNS解析器缓存&a…

实例2:树莓派GPIO控制外部LED灯闪烁

实例2:树莓派GPIO控制外部LED灯闪烁 实验目的 通过背景知识学习,了解四足机器人mini pupper搭载的微型控制计算机:树莓派。通过树莓派GPIO操作的学习,熟悉GPIO的读写控制。通过外部LED灯的亮灭控制,熟悉树莓派对外界…

vue3 + vite 使用 svg 可改变颜色

文章目录vue3 vite 使用 svg安装插件2、配置插件 vite.config.js3、根据vite配置的svg图标文件夹,建好文件夹,把svg图标放入4、在 src/main.js内引入注册脚本5、创建一个公共SvgIcon.vue组件6.1 全局注册SvgIcon.vue组件6.2、在想要引入svg的vue组件中引…