Pyqt Model/view框架 3.可編輯項
>[上篇](http://www.rzrgm.cn/hangxin1940/archive/2012/12/07/2806449.html)介紹了如何自定義渲染view項,通過這篇,將掌握如何實現(xiàn)view單元項的編輯
可編輯單元項
---
在[上篇](http://www.rzrgm.cn/hangxin1940/archive/2012/12/07/2806449.html)已完成的代碼中,為`MyListModel`類加入一下方法:
def flags(self, index):
"""
flag描述了view中數(shù)據(jù)項的狀態(tài)信息
"""
#首先獲取超類的flags返回值
flag=super(MyListModel,self).flags(index)
#或運算,將ItemIsEditable(可編輯)標(biāo)志疊加上去
return flag | Qt.ItemIsEditable
現(xiàn)在運行完整代碼,*雙擊*單元項,就可以編輯它了。
此時我們發(fā)現(xiàn),雖然可以編輯,但是雙擊后,編輯區(qū)域是空,并且編輯完成后,也無任何效果
我們首先解決編輯時數(shù)據(jù)的顯示問題,將以下代碼添加到`MyListModel`->`data`方法中,也就是增加一個判斷條件:
#當(dāng)前角色為編輯模式,顯示原本數(shù)據(jù)
#這樣,當(dāng)我們雙擊單元項時,不至于什么都不顯示
if role==Qt.EditRole:
return self._data[row]
然后,為了保存數(shù)據(jù),我們?yōu)閌MyListModel`類增加如下方法:
def setData(self,index,value,role=Qt.EditRole):
"""
設(shè)置數(shù)據(jù)
"""
#如果當(dāng)前為編輯角色
if role==Qt.EditRole:
#QVariant的這個方法,返回的bool類型表示這個值是否可以被轉(zhuǎn)為int類型
value_int, ok=value.toInt()
#如果可以轉(zhuǎn)為int類型
if ok:
#保存數(shù)據(jù)
self._data[index.row()]=value_int
#發(fā)射數(shù)據(jù)更改信號,以便讓view更新
self.dataChanged.emit(index,index)
return True
#數(shù)據(jù)是否成功更新
return False
現(xiàn)在運行代碼,可以正常編輯并更新數(shù)據(jù)了。
進(jìn)度條根據(jù)輸入的數(shù)值改變
Model處理流程
---
目前為止,我們可以編寫只讀、可編輯、自定義單元項的model了,下面是處理流程
Model.flags model item可編輯
|
| 創(chuàng)建編輯器
|
Model.data 返回編輯狀態(tài)下的數(shù)據(jù)
|
| 設(shè)置編輯器里的數(shù)據(jù)
|
Model.setData 編輯完成,并保存數(shù)據(jù)
>通過這篇,我們可以編寫可編輯的model了,[下篇](http://www.rzrgm.cn/hangxin1940/archive/2012/12/07/2806453.html),我們將學(xué)會如何用delegate委托渲染model的編輯模式
浙公網(wǎng)安備 33010602011771號