PyQt学习随笔:Model/View中视图数据项编辑变动实时获取变动数据的方法

摘要:
在模型/视图中编辑视图数据后,如何实时获取编辑数据的更改位置和更改状态?在查阅了一些资料后,我基本上理解了模型的setData方法必须重写以进行拦截。然而,在线引入的想法是从QAbstractTableModel派生出一个自己的Model类,并实现相关的方法,这相对复杂。然而,老猿今天要介绍的是一种更简单的方法,即从类QStandardItemModel生成子类,该类派生自PyQt实现的QAbstractTableModel。这种方法更简单,只需要重写setData方法。

对于Model/View中视图的数据编辑后怎么能实时获取编辑的数据变动位置和变动情况查阅了一些资料,终于基本弄明白必须重写Model的setData方法才能截获。setData方法是视图中各种角色数据发生更新后视图用于更新Model数据的方法,只要重写该方法就可以截获视图对Model数据的修改。

不过网上介绍的思路都是从QAbstractTableModel派生出一个自己的Model类,并实现相关方法,比较复杂。老猿还需要仔细研究这种方法的详细方式及优缺点,相关文章大部分都是基于Qt实现的,懂C++语言的理解后简单修改就能迁移到PyQt实现模式,在这推荐大家阅读CSDN博友cloveses的《PyQt5使用记录之二 —— QTableView实现数据的显示、编辑、删除与添加》,这是基于PyQt介绍的。

不过老猿今天要介绍的是一种更简单的方式,那就是从PyQt已经实现的从QAbstractTableModel派生的类QStandardItemModel来派生子类,这种方式更简单,只需要重写setData方法就可以了。

步骤如下:
一、从QStandardItemModel派生子类并重写setData方法

class  UpdateItemModel(QStandardItemModel):
    def setData(self, index, value, role=Qt.EditRole):
        # 编辑后更新模型中的数据 View中编辑后,View会调用这个方法修改Model中的数据
        print(f"update {index.row()}行{index.column()}列角色为{role}的数据为:{value},初始数据为{index.data()}")
       .......#添加自己的数据处理代码
       return super().setData(index, value, role)

二、通过自定义类定义自己的存储对象
在应用中最好是应用窗口构造函数中使用如下语句:
self.tableViewModel = UpdateItemModel()

这样简单两步就实现了View更新数据的截获。

这种方法与直接从QStandardItemModel派生自定义类,当然其他的从QAbstractTableModel派生的类如QStringListModel也可以这样使用来派生自定义类。与从QAbstractTableModel派生自定义类相比该方法的优缺点还需要进一步研究,但它至少提供了一种获取更新数据进行处理的简单实现思路。


PyQt学习随笔:Model/View中视图数据项编辑变动实时获取变动数据的方法第1张

博客地址:https://blog.csdn.net/LaoYuanPython

老猿Python博客文章目录:https://blog.csdn.net/LaoYuanPython/article/details/98245036

免责声明:文章转载自《PyQt学习随笔:Model/View中视图数据项编辑变动实时获取变动数据的方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Linux下为Calibre书库打中文目录名与文件名补丁Python+selenium 自动化-调用dom节点的click()监听事件,强力操作节点!穿透元素进行点击,节点被遮挡不可点击解决方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SQL批量添加数据库中所有用户数据表描述

--SQL批量添加数据库中所有用户数据表描述 --操作说明:请先准备一数据表为名称为tblist,表名字段tbname nvarchar(255),数据表描述字段chnname nvarchar(255),将所有已存在的数据表和对应描述添加到数据表tblist中 --脚本编写步骤:1、游标读取所有数据表名;2、读取指定数据表描述;3、判断指定数据表描述是否...

【ECharts】04 数据交互

ECharts 异步加载数据 ECharts 通常数据设置在 setOption 中,如果我们需要异步加载数据,可以配合 jQuery等工具,在异步获取数据后通过 setOption 填入数据和配置项就行。 ECharts 通常数据设置在 setOption 中,如果我们需要异步加载数据,可以配合 jQuery等工具,在异步获取数据后通过 setOptio...

微信小程序基础学习笔记2:数据绑定相关

VUE语法 所有前端wxml中绑定的数据变量,都要定义在data中。 绑定事件,bindTap res ,取数据 currentTarget->dataset 这里的data-id中的data必须写,后面的id、title等可以任意自定义,H5的新属性,后面的id全部要用小写 myTap:function(res){ console.write }...

将xml文件数据导入到sql中[原]

        设计数据库的时候为了操作的方便,我们可以选择用xml格式文件来保存我们的数据表结构及其数据。这样的好处是多方面的,设计简单,操作方便,自己可以开发一个设计数据库表的应用程序直接对xml文件进行操作。其实另外一个好处是在最终使用的时候很容易将xml数据导入到任何我们想要的数据库中,不过注明的是这中设计的方法只在于简便,不可能达到其他专门工具的...

MySQL 如何存储长度较大的varchar与blob

本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/96 最近,在工作中遇到了MySQL中如何存储长度较长的字段类型问题,于是花了一周多的时间抽空学习了一下,并且记录下来。 MySQL大致的逻辑存储结构在这篇文章中有介绍,做为基本概念:InnoDB 逻辑存储结构 注:文中所...

使用Python Requests上传表单数据和文件

在Python环境下写一个HTTP客户端,发送POST请求,同时上传表单数据和文件,我们可以使用Requests模块来实现。代码如下: data = { 'name': 'nginx' } files = {'file': open("abc.csv", 'rb')} response = requests.post(url, data=data...