Python 如何从.model中删除原始数据
下面的代码创建一个Python 如何从.model中删除原始数据,python,qt,pyqt,Python,Qt,Pyqt,下面的代码创建一个QListView。单击其项应将其从.model()中删除。删除项目时,存在索引器错误:列表索引超出范围。代码有什么问题 import os,sys from PyQt4 import QtCore, QtGui app=QtGui.QApplication(sys.argv) elements={'Animals':{1:'Bison',2:'Panther',3:'Elephant'},'Birds':{1:'Duck',2:'Hawk',3:'Pigeon'},'Fish
QListView
。单击其项应将其从.model()中删除。删除项目时,存在索引器错误:列表索引超出范围
。代码有什么问题
import os,sys
from PyQt4 import QtCore, QtGui
app=QtGui.QApplication(sys.argv)
elements={'Animals':{1:'Bison',2:'Panther',3:'Elephant'},'Birds':{1:'Duck',2:'Hawk',3:'Pigeon'},'Fish':{1:'Shark',2:'Salmon',3:'Piranha'}}
class Model(QtCore.QAbstractListModel):
def __init__(self):
QtCore.QAbstractListModel.__init__(self)
self.items=[]
self.modelDict={}
def rowCount(self, parent=QtCore.QModelIndex()):
return len(self.modelDict)
def data(self, index, role):
if index.isValid():
if role==QtCore.Qt.ItemDataRole:
key=str(index.data().toString())
returnedValue=self.modelDict.get(key)
return QtCore.QVariant(returnedValue)
elif role==QtCore.Qt.DisplayRole:
row=index.row()
itemTitle=self.items[row]
return QtCore.QVariant(itemTitle)
def addItems(self):
for key in self.modelDict:
index=QtCore.QModelIndex()
self.beginInsertRows(index, 0, 0)
self.items.append(key)
inst=self.modelDict.get(key)
self.setData(index, QtCore.QVariant(inst), QtCore.Qt.DisplayRole)
self.endInsertRows()
def removeByIndex(self, index):
if index.isValid():
row=index.row()
self.beginRemoveRows(QtCore.QModelIndex(), row, 0)
self.items=[each for i,each in enumerate(self.items[:]) if i!=row]
self.endRemoveRows()
class ListView(QtGui.QListView):
def __init__(self):
super(ListView, self).__init__()
self.model= Model()
self.model.modelDict=elements
self.model.addItems()
self.setModel(self.model)
self.clicked.connect(self.itemClicked)
self.show()
def itemClicked(self, index):
itemTitle=self.model.data(index, QtCore.Qt.DisplayRole).toString()
itemData=self.model.data(index, QtCore.Qt.ItemDataRole).toPyObject()
print 'itemTitle: "%s" itemData: %s'%(itemTitle,itemData)
self.model.removeByIndex(index)
window=ListView()
sys.exit(app.exec_())
删除行时未更新行数;最近这导致了没有提供数据的空元素。这是可行的(请注意,为了简单起见,我删除了QVariants):
rowCount总是指初始输入,而不是当前的行集。是否有任何方法可以在删除项后更新
.model
,这样.rowCount()
方法将返回正确的信息?返回len(self.items)
?将此行包含在数据()中方法会起到以下作用:如果没有索引。isValid()或者没有(0错误!谢谢!因此我必须从rowCount()
返回self.items
列表,而不是从不更改self.modelDict
!再次感谢!
class Model(QtCore.QAbstractListModel):
def __init__(self):
QtCore.QAbstractListModel.__init__(self)
self.items=[]
self.modelDict={}
def rowCount(self, parent=QtCore.QModelIndex()):
return len(self.items)
def data(self, index, role):
if index.isValid():
if role==QtCore.Qt.ItemDataRole:
key=str(index.data().toString())
returnedValue=self.modelDict.get(key)
return QtCore.QVariant(returnedValue)
elif role==QtCore.Qt.DisplayRole:
row=index.row()
itemTitle=self.items[row]
return itemTitle
def addItems(self):
for key in self.modelDict:
index=QtCore.QModelIndex()
self.beginInsertRows(index, 0, 0)
self.items.append(key)
inst=self.modelDict.get(key)
self.setData(index, inst, QtCore.Qt.DisplayRole)
self.endInsertRows()
def removeByIndex(self, index):
if index.isValid():
row=index.row()
self.beginRemoveRows(QtCore.QModelIndex(), row, 0)
self.items=[each for i,each in enumerate(self.items[:]) if i!=row]
self.endRemoveRows()
class ListView(QtGui.QListView):
def __init__(self):
super(ListView, self).__init__()
self.model= Model()
self.model.modelDict=elements
self.model.addItems()
self.setModel(self.model)
self.clicked.connect(self.itemClicked)
self.show()
def itemClicked(self, index):
itemTitle=str(self.model.data(index, QtCore.Qt.DisplayRole))
print 'itemTitle: "%s"'%(itemTitle)
self.model.removeByIndex(index)