2014-09-16 2 views
1

아래 코드는 모델이있는 단일 QListView를 만듭니다. 해당 항목을 클릭하면 해당 항목이 모델에서 삭제됩니다. 그러나 QListView은 여전히 ​​모델 항목의 수가 변경되지 않았 음을보고합니다 (삭제 된 항목이없는 것처럼). 그것을 고칠 방법이 있습니까?model()을 사용하여 항목을 삭제 한 후 정리하는 방법

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 not index.isValid(): 
      return QtCore.QVariant() 
     if not (0 <= index.row() < len(self.items)): 
      return QtCore.QVariant() 

     if not index.isValid(): 
      return QtCore.QVariant() 
     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 not index.isValid(): return 
     row=index.row() 
     self.beginRemoveRows(QtCore.QModelIndex(), row, 0) 
     self.items=self.items[:row]+self.items[row+1:] 
     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): 
     print 'NUMBER OF ITEMS BEFORE DELETE: %s'%self.model.rowCount() 
     self.model.removeByIndex(index) 
     print 'NUMBER OF ITEMS AFTER DELETE: %s'%self.model.rowCount()   

window=ListView() 
sys.exit(app.exec_()) 

답변

1

enter image description here

완전 모델에서 항목을 삭제하는 방법에 대한 예제를 작업.

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.items) 

    def data(self, index, role): 
     if not index.isValid(): 
      return QtCore.QVariant() 
     if not (0 <= index.row() < len(self.items)): 
      return QtCore.QVariant() 

     if not index.isValid(): 
      return QtCore.QVariant() 
     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 not index.isValid(): return 
     row=index.row() 
     self.beginRemoveRows(QtCore.QModelIndex(), row, 0) 
     self.items=self.items[:row]+self.items[row+1:] 
     key=str(index.data().toString()) 
     if self.modelDict.get(key): self.modelDict.pop(key,None) 
     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): 
     print 'NUMBER OF ITEMS BEFORE DELETE: %s'%self.model.rowCount() 
     self.model.removeByIndex(index) 
     print 'NUMBER OF ITEMS AFTER DELETE: %s'%self.model.rowCount()   

window=ListView() 
sys.exit(app.exec_()) 
+0

변경할 수 있습니까? diff를 만드는 데는 유감 스럽기 때문에. – UmNyobe

관련 문제