2011-02-03 63 views
0

我試圖學習Qt的模型視圖體系結構,我想知道在下面的代碼中,如何在編輯項目後連續調用data(),雙擊後它?調用數據()在QAbstractListModel

在這個樣機中,它不是一個真正的問題,因爲它只是一個簡單的五項目列表,但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 2011-02-04 15:34:08

回答

1

我相信每次Qt重繪的GUI(比如用戶向上和向下滾動,使窗口成爲焦點等)Qt將重繪,這時候它會叫.data()

0

這可能只是調試器。當你達到斷點時,如果調試器繪製你的列表視圖,那麼只要你繼續執行,它就會重繪。嘗試讓調試器和列表視圖在屏幕上彼此分離,並查看這是否會改變任何內容。

相關問題