Pyqt Model/view框架 3.可编辑项

>上篇介绍了如何自定义渲染view项,通过这篇,将掌握如何实现view单元项的编辑

可编辑单元项

上篇已完成的代码中,为MyListModel类加入一下方法:

    def flags(self, index):
        """
        flag描述了view中数据项的状态信息
        """

        #首先获取超类的flags返回值
        flag=super(MyListModel,self).flags(index)

        #或运算,将ItemIsEditable(可编辑)标志叠加上去
        return flag | Qt.ItemIsEditable

现在运行完整代码,双击单元项,就可以编辑它了。 此时我们发现,虽然可以编辑,但是双击后,编辑区域是空,并且编辑完成后,也无任何效果

我们首先解决编辑时数据的显示问题,将以下代码添加到MyListModel->data方法中,也就是增加一个判断条件:

    #当前角色为编辑模式,显示原本数据
    #这样,当我们双击单元项时,不至于什么都不显示
    if role==Qt.EditRole:
        return self._data[row]

然后,为了保存数据,我们为MyListModel类增加如下方法:

    def setData(self,index,value,role=Qt.EditRole):
        """
        设置数据
        """

        #如果当前为编辑角色
        if role==Qt.EditRole:
            #QVariant的这个方法,返回的bool类型表示这个值是否可以被转为int类型
            value_int, ok=value.toInt()

            #如果可以转为int类型
            if ok:
                #保存数据
                self._data[index.row()]=value_int
                #发射数据更改信号,以便让view更新
                self.dataChanged.emit(index,index)

                return True
            #数据是否成功更新
            return False

            现在运行代码,可以正常编辑并更新数据了。

进度条根据输入的数值改变

Model处理流程

目前为止,我们可以编写只读、可编辑、自定义单元项的model了,下面是处理流程

    Model.flags  model item可编辑
        |
        |    创建编辑器
        |
    Model.data   返回编辑状态下的数据
        |
        |    设置编辑器里的数据
        |
    Model.setData    编辑完成,并保存数据

>通过这篇,我们可以编写可编辑的model了,下篇,我们将学会如何用delegate委托渲染model的编辑模式

posted on   黑暗伯爵  阅读(1849)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述

导航

< 2012年4月 >
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 1 2 3 4 5
6 7 8 9 10 11 12

统计

点击右上角即可分享
微信分享提示