最强大脑记忆曲线(12)-- 录入数据修改

news2024/11/14 18:57:50

录入数据修改

  • 一、设计思路
  • 二、解决过程
    • 2.1 设计修改窗口
    • 2.2 转成py文件
    • 2.3 写业务逻辑
      • 1、先显示一下基础页面
      • 2、配合适配器,自动调整窗口大小
      • 3、在数据录入窗口或背记窗口双击某条记录
        • 3.1 增加信号
        • 3.2 在槽函数中打开修改页面
        • **==3.3 两个页面之间传递信号==**
        • 3.4 在子窗口中显示原数据,并在修改提交后,更新数据

一个好用的应用程序,一定是在千百遍的测试中逐渐完善起来的。我和孩子们在使用自己开发的“按记忆曲线识记知识点”应用程序时,发现无法修改录入错误的数据。哈哈~ 虽然一直都知道“增删改查”这个概念,但真正做软件时却给忽略了。那么,开始修改吧!

一、设计思路

1、修改操作可能发生在录入过程中,也可能发生在背记过程中。所以两个页面都应该有修改功能;
2、修改的方式,希望是双击某单条记录,弹出一个修改窗口,然后提交更新原记录。看上去不难,但需要增加一个小弹窗。

二、解决过程

2.1 设计修改窗口

简单设计了一个数据修改的页面:
在这里插入图片描述

2.2 转成py文件

使用以下语句,将ui文件转换为py文件:

pyuic5 -o ui_correct.py program\ui\correct.ui

2.3 写业务逻辑

1、先显示一下基础页面

以下程序可以先显示一下基础页面:

import sys
from PyQt5.QtWidgets import (QApplication, QMainWindow, QDialog)
from ui_correct import Ui_correction
class QmyCorrection(QDialog):

def __init__(self, parent=None):
    super().__init__(parent)  # 调用父类构造函数,创建窗体
    self.ui = Ui_correction()  # 创建UI对象
    self.ui.setupUi(self)  # 构造UI界面

#  ============窗体测试程序 ==================
if __name__ == "__main__":  # 用于当前窗体测试
    app = QApplication(sys.argv)  # 创建GUI应用程序
	form = QmyCorrection()  # 创建窗体
	form.show()
	sys.exit(app.exec_())

运行该页面后,发现窗体相对我的机器来说屏幕有点小。

2、配合适配器,自动调整窗口大小

可以增加以下语句,让窗口自动调整大小:

    # 调整窗口大小
    desktop = QDesktopWidget()
    self.screen_width = desktop.screenGeometry().width()
    self.screen_height = desktop.screenGeometry().height()
    self.resize(self.screen_width/3,self.screen_height/3)

3、在数据录入窗口或背记窗口双击某条记录

3.1 增加信号

分别给数据录入窗口和背记窗口增加以下内容,以便双击时打开数据修改页面:

       self.ui.tableView_4.doubleClicked.connect(self.correctWords)
       self.ui.tableView.doubleClicked.connect(self.correctWords)

3.2 在槽函数中打开修改页面

下面脚本可以实现双击打开修改页面

    # 双击打开修改页面
    self.page_correct = myCorrect.QmyCorrection()
    self.page_correct.setAttribute(Qt.WA_DeleteOnClose)  # 关闭时自动删除这个实例

    self.page_correct.exec()

但是新页面怎样知道需要修改哪一条记录呢?
【技术点关联】前面的笔记中有一篇
“复习页面逻辑实现”时,好像也有过这样的思考。见: https://blog.csdn.net/zwy_0309/article/details/127714340
其中问题“选择单词进入复习计划列表”提到:
self.ui.tableView.selectionModel().selectedRows(),可以得到一个index列表,这些index有一个row()属性,可以帮助我们获取选中的行号。
self.qrModel.record(行号).value(列号),可以得到某个字段信息。

但这次不同于上次选择复习单词,上次选择了多行,这次没有选择,只是在某一行上双击了一下,有没有其他办法呢?正面语句可以解决问题
【答案】tableview.selectedIndexes()[0].row()

3.3 两个页面之间传递信号

之前我采用了全局变量法解决两个页面之间传递参数的问题,此外还有两种方法:
❣️一种常见方法,就是使用信号槽的方法,适用于子窗口向主窗口传递信号
在这里插入图片描述
【个人总结】
💭 定义信号:在发射信号侧,且在init之前;使用pyqtSignal(type);
💭 绑定信号:在接收信号侧,用connect 把信号和槽绑定在一起
💭 发射信号:在发射信号侧,用emit 发射信号

❣️ 我认为还有一种方法:适用于主窗口中向子窗口传递参数
在这里插入图片描述
即,在主窗口中打开子窗口对象,并在主窗口中调用子窗口对象中的方法crt,而crt方法带着一个参数,即word_id。

3.4 在子窗口中显示原数据,并在修改提交后,更新数据

def crt(self, canshu):
    print('我在子窗中,我得到的参数是{}。'.format(canshu))
    self.word_id = canshu

    # 显示原数据
    self.stuModel = myGlobValues.get_value('G_tableModelStu')
    self.subModel = myGlobValues.get_value('G_tableModelSub')
    self.G_db = myGlobValues.get_value('G_db')
    self.qr_word = QSqlQuery(self.G_db)

    self.qr_word.exec("select a.word_id , a.word , a.means ,c.stu_name ,b.sub_name"
                          " from words a, subject b, student c "
                 " where a.sub_id = b.sub_id and a.stu_id=c.stu_id and a.word_id = '" + self.word_id +"'" )
    self.qr_word.last()

    word = self.qr_word.value(1)
    means = self.qr_word.value(2)
    stu_name = self.qr_word.value(3)
    sub_name = self.qr_word.value(4)


    self.ui.textEdit.setText(word)
    self.ui.textEdit_2.setText(means)

    self.ui.comboBox.setModel(self.stuModel)
    self.ui.comboBox.setModelColumn(self.stuModel.fieldIndex('stu_name'))
    row = 0
    for i in range(0,self.stuModel.rowCount()):
        if self.stuModel.record(i).value(1) == stu_name:
            row = i
    print(row)
    self.ui.comboBox.setCurrentIndex(row)

    self.ui.comboBox_2.setModel(self.subModel)
    self.ui.comboBox_2.setModelColumn(self.subModel.fieldIndex('sub_name'))
    row_sub = 0
    for i in range(0, self.subModel.rowCount()):
        if self.subModel.record(i).value(1) == sub_name:
            row_sub = i
    self.ui.comboBox_2.setCurrentIndex(row_sub)


def do_commit(self):
    stu_row = self.ui.comboBox.currentIndex()
    stu_id = self.stuModel.data(self.stuModel.index(stu_row, 0))

    sub_row = self.ui.comboBox_2.currentIndex()
    sub_id = self.subModel.data(self.subModel.index(sub_row, 0))

    word = self.ui.textEdit.toPlainText()
    means = self.ui.textEdit_2.toPlainText()
    self.qr_word.exec("update words set word = '"+word+"',"
                                    " means = '"+ means +"',"
                                    " stu_id = '"+stu_id+"',"
                                    " sub_id= '"+sub_id+"'"
                        " where word_id = '"+self.word_id+"'")

    errorTable = self.qr_word.lastError().text()
    if errorTable != '':  # 新数据库会是这样的情况 没有一条记录
        QMessageBox.warning(self, '提示:', errorTable)
    else:
        cs = True
        self.s_correct.emit(cs)

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

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

相关文章

24点问题(带输出构造方式)

问题描述: 在屏幕上输入1〜10范围内的4个整数(可以有重复),对它们进行加、减、乘、除四则运算后(可以任意的加括号限定计算的优先级),寻找计算结果等于24的表达式。 例如输入4个整数4、5、6、7…

1. RabbitMq 的基本概念

参考使用: 尚硅谷 消息中间件 RabbitMQ 课件 MQ 的概念 什么是 MQ MQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是 message 而已,还是一种跨进程的通信机制,用…

[附源码]计算机毕业设计毕业生就业管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Minecraft 1.19.2 Forge模组开发 05.矿石生成

我们本次尝试在主世界生成模组中自定义的矿石 1.由于1.19的版本出现了深板岩层的矿石,我们要在BlockInit类中声明一个矿石的两种岩层形态: BlockInit.java package com.joy187.re8joymod.init;import com.joy187.re8joymod.Main; import net.minecraf…

微服务框架 SpringCloud微服务架构 10 使用Docker 10.8 数据卷挂载案例1

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构10 使用Docker10.8 数据卷挂载案例110.8.1 挂载数据卷10.8.2 案例10.8.3 总…

Pr:导出设置之高级设置及 VR 视频

视频 VIDEO设置因所选导出格式而异。每种格式都有独特的要求,这些要求决定了哪些设置可用。以导出文件格式为 H.264 为例,下面给出有关高级设置 Advanced Settings以及 VR 视频 VR Video的选项及说明。高级设置 Advanced Settings关键帧距离Key Frame Di…

期末复习-软件体系结构

软件体系结构一、软件重用与构件技术软件重用的定义重用驱动的软件的开发过程构件的三种描述模型三种构件分类方法的组织方式,检索方式,刻面分类法二、软件体系结构概述软件体系结构 构件 连接件 约束软件体系结构的四个发展阶段三、软件体系结构风格…

塔望3W消费战略全案丨牛小范低脂即食肉蛋白 行走的米其林牛排

牛小范 客户:山东如康集团 品牌:牛小范 服务:3W消费战略 品牌全案 项目背景 山东如康集团是一家集牛羊肉生产、加工与销售等为一体的大型综合性集团企业,是山东省级“专精特新”企业、农业产业化市级龙头企业和山东省"十三…

Linux命令:scp

目录 简介 一、语法 二、示例 2.1 将本地文件复制到远程主机目录 2.2 将本地目录复制到远程主机目录 2.3 将远程主机的文件复制到本机 2.4 复制远程主机目录到本机 简介 今天我们来介绍一个Linux命令:scp scp — secure copy (remote file copy program)&am…

Vue实现手机端界面的购物车案例

目录 前期准备 Header Goods Footer Counter 今天用Vue实现的一个手机端的购物车案例,着重阐述组件化思想的优势,将页面的内容分成各个模块进行书写,然后数据传输,父传子、子传父、兄弟数据共享等,这方面知识不牢…

[附源码]计算机毕业设计springboot游戏商城平台论文

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

PHP 经纬度坐标相关计算方法

1. 前言 2. 计算经纬度坐标间的距离 3. 根据经纬度坐标距离排序 4. 经纬度范围查询 1. 前言 想要测试本文提供的几个功能函数,可以使用下面这个数据表结构及其数据 CREATE TABLE user ( id int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 用户id, name v…

html静态网站基于游戏网站设计与实现共计10个页面 (仿地下城与勇士游戏网页)

🎉精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

UDS(83服务-AccessTimingParameter)

诊断协议那些事儿 诊断协议那些事儿专栏系列文章,本文介绍诊断和通讯管理功能单元下的83服务AccessTimingParameter,该服务的目的是读取/修改有效通信的计时参数。 文章目录 诊断协议那些事儿一、83服务-AccessTimingParameter二、请求格式子功能参数定义-timingParameterA…

Java并发编程—死锁

文章目录死锁什么叫做加锁?死锁代码理解:如何避免死锁?资源限制的挑战什么是资源限制?资源限制引发的问题?如何解决资源限制的问题?在资源限制情况下进行并发编程————————————————————…

物联网 (IoT) 为何如此重要?哪些技术让物联网成为了可能?

随着社会的进步和科技的发展,定位技术在技术手段、定位精度、可用性等方面均取得质的飞越,并且逐步从航海、航天、航空、测绘、军事、自然灾害预防等“高大上”的领域逐步渗透社会生活的方方面面,成为人们日常中不可或缺的重要应用——比如人…

[附源码]计算机毕业设计基于SpringBoot的剧本杀管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

用Python画出圣诞树,瞧瞧我这简易版的吧

前言 嗨嗨,大家好,我是小圆 今天来实现一下 用python画出圣诞树 代码 模块 源码.点击领取即可 import turtle as t from turtle import * import random as r import time圣诞树细节以及画布大小 画布大小,背景颜色都可以改,…

数据结构——链表

目录 一、链表概述 二、模拟实现链表 1、结点 2、遍历链表 3、获取链表的长度 4、添加元素 (1)、头插法 (2)、尾插法 (3)、在指定位置插入元素 5、删除元素 (1)、删…

Springboot整合mybatis多数据源

Mybatis中如何配置多数据源 一 什么情况下会用到多数据库? 场景1: 一个商城网站,一个游戏网站,商城网站已经做好,游戏网站正在开发,游戏网站上的很多道具需要用到商城网站的产品数据,这种情况…