2016-08-26 13 views
0

私はPyQt4モデルビューを理解しようとしています。私は単純なリストモデルのビューを構築しました。次に、モデルをどのように実行するかを見るために「ステップ」変数を使用しました。PyQt4モデルはどのように実行されますか?

私が理解できないのは、なぜ新しいループが実行されるたびに、rowCountメソッドが5回呼び出され、その後2回ごとに呼び出されるのですか?リスト内のアイテムの数とは無関係です。

データメソッドの場合は明らかです。役割の状態が毎回確認され、8-15の異なる役割があります。

from PyQt4 import QtGui, QtCore, uic 
import sys 

step = 0 
class ModelOne(QtCore.QAbstractListModel): 

    global step 
    step += 1 
    print(step, 'init') 

    def __init__(self, colors = [], parent = None): 
     QtCore.QAbstractListModel.__init__(self, parent) 
     self.__colors = colors 

    def rowCount(self, parent):   
     global step 
     step += 1 
     print(step, 'rowCount') 

     return len(self.__colors) 

    def data(self, index, role):    
     global step 
     step += 1 
     print(step, 'data')  

     if role == QtCore.Qt.DisplayRole:   
      row = index.row() 
      value = self.__colors[row] 
      return value 

if __name__ == '__main__': 

    app = QtGui.QApplication(sys.argv) 
    listView = QtGui.QListView() 
    listView.show() 
    model = ModelOne(['black', 'white']) 
    listView.setModel(model) 
    sys.exit(app.exec_()) 


OUTPUT 

loop 1  
1 init 
2-6 rowCount (5 steps) 
7-14 data  (8 steps) 
15 rowCount 
16 rowCount 
17-24 data  (8 steps) 
25 rowCount 
26 rowCount 
27-34 data  (8 steps) 

loop 2 
35-40 rowCount (5 step) 
41-55 data  (15 step) 
56 rowCount 
57 rowCount 
58-72 data  (15 step) 

答えて

0

QAbstractItemModelQAbstractListModelのためのQtのソースコードを取得し、rowCount関数の呼び出しグラフを作成することです、この質問に答えるための唯一の方法。 Qtはあらゆる種類の境界チェック操作を行う必要があるたびにrowCountを呼び出すため、イメージがかなり広がっているとイメージします。言うまでもなく、これはであり、ではなく、特定のプログラムにどのようにrowCountが使用されるかを簡単に説明します。

しかし、私はモデルの実行をトレースすることはそれを理解しようとする良い方法だとは思わない。モデルは、の抽象表現と理解される必要があります。彼らが実際にどのように動作するかを知りたい場合は、Model/View Programming Overview(特にModel Subclassing Reference)を読んでください。

関連する問題