2011-02-03 8 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

これを呼ぶようなときです。ブレークポイントに達すると、デバッガがリストビューにペイントすると、実行を続けるとすぐに再描画されます。デバッガとリストビューを画面上で分離しておき、これが何か変わるかどうか確認してください。