PyQt4如何执行模型?

时间:2016-08-26 15:03:48

标签: python pyqt4 model-view

我正在尝试了解PyQt4模型视图。我已经构建了简单的列表模型视图。然后我使用“step”变量来查看模型是如何执行的。

我无法理解的是:为什么每次执行新循环时,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)

1 个答案:

答案 0 :(得分:0)

回答此问题的唯一方法是获取QAbstractItemModelQAbstractListModel的Qt源代码,并为rowCount函数创建调用图。我认为它会非常广泛,因为Qt每次需要进行任何类型的边界检查操作时都会调用rowCount。毋庸置疑,这意味着将成为rowCount如何用于任何特定程序的简单解释。

但无论如何,我认为追踪模型的执行并不是试图理解模型的好方法。模型需要被理解为抽象。如果您想了解它们的工作原理,请阅读Model/View Programming Overview(特别是Model Subclassing Reference)。