Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从.model中删除原始数据_Python_Qt_Pyqt - Fatal编程技术网

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)