2011-02-03 5 views
0

Qt의 모델 뷰 아키텍처를 배우려고합니다. 다음 코드에서 두 번 클릭하여 항목을 편집 할 때 data()가 계속 호출되는 방법이 궁금합니다. 그것?QAbstractListModel의 data() 호출

이 모형에서는 단순한 5 개 항목 목록이므로 문제가되지 않지만 Qt는 의 데이터를 모두의 데이터를 계속 조회합니다. 이 예상되는 동작입니까, 아니면 피할 수있는 코드 조각이 누락 되었기 때문에 모델에서보기에 액세스 할 수있는 데이터가있는 파일/개체에 대한 추가적이고 잠재적으로 값 비싼 호출이 없습니다.

차이가 나는 경우 PyQt4 v4.8.2를 사용하고 있습니다. 미리 감사드립니다!

from PyQt4 import QtCore, QtGui 

class Model(QtCore.QAbstractListModel): 

    def __init__(self): 
     QtCore.QAbstractTableModel.__init__(self) 
     self.table = ["Item 1", "Item 2", "Item 3", "Item 4", "Item 5"] 
     self.i = 0 

    def setData(self, index, value, role = QtCore.Qt.EditRole): 
     value = QtCore.QVariant.toPyObject(value) 
     print "setData:",value 

     row = index.row() 
     self.table[row] = value 

     self.emit(QtCore.SIGNAL("dataChanged(const QModelIndex&, const QModelIndex&)"), index, index) 
     return True 

    def rowCount(self,parent): 
     return 5 

    def flags(self, index): 
     return QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled 

    def data(self,index,role): 
     if role == QtCore.Qt.DisplayRole or role == QtCore.Qt.EditRole: 
      row = index.row() 
      self.i = self.i + 1 
      print self.i 
      return self.table[row] 

if __name__ == "__main__": 
    import sys 
    app = QtGui.QApplication(sys.argv) 

    m = Model() 

    view = QtGui.QListView() 
    view.setModel(m) 
    view.show() 

    view2 = QtGui.QTableView() 
    view2.setModel(m) 

    view.show() 
    view2.show() 
    app.exec_() 
    sys.exit() 
+0

예, 예상되는 동작입니다. – armonge

답변

1

나는 Qt이 (상하 말하자면 사용자가 스크롤 초점 등으로 창을 제공합니다) 당신의 GUI를 다시 그리기 다시 그리기 것이다 Qt 매번 믿고 그냥 디버거 수 있습니다 .data()

0

이 전화를 할 때입니다. 중단 점에 도달하면 디버거가 목록보기 위에 페인트하면 실행을 계속하자마자 다시 그려집니다. 디버거와 목록보기를 화면에서 서로 분리하여 시도해보고 변경 사항이 있는지 확인하십시오.