PyQt4.9.1视图从不调用model.data

时间:2012-06-01 17:27:12

标签: pyqt4 python-3.2 model-view

我正在试图弄清楚如何使用PyQt4.9.1中的模型和视图,我遇到了一些问题。

以下是重要的代码:

class TestModel(QtGui.QStandardItemModel):
    def __init__(self,parent=None):
        QtGui.QStandardItemModel.__init__(self,parent)
        self.initData()
        self.headings = ['name','value','']

    def initData(self):
        self.rows = [['name {0}'.format(i), i] for i in range(20)]

    def data(self, index, value, role):
        print ("foo")
        if not index.isValid():
            return 
        if (role == QtCore.Qt.DisplayRole):
            row = index.row()
            col = index.column()
            if  (col == 3):
                return "BUTTON GOES HERE"
        return self.rows[row][col]

    def headerData(self,section,orientation,role):
        if (role == QtCore.Qt.DisplayRole):
            if (orientation == QtCore.Qt.Horizontal):
                 return self.headings[section]

    def rowCount(self,parent):
        return len(self.rows)

    def columnCount(self,parent):
        return 3

class MainWindow(QtGui.QWidget):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.m = TestModel()
        self.initUi()

    def initUi(self):   
        layout = QtGui.QVBoxLayout()
        widget = QtGui.QTableView()
        widget.setModel(self.m)
        layout.addWidget(widget)
        self.setLayout(layout)
        self.show()

以下是我启动应用程序的MainWindow时发生的情况:没有错误消息,使用正确的行数和列数以及正确的标题绘制表格,但表格为空。您可能会注意到模型的绘制方法以print语句开始。永远不会达到这种说法。有什么我想念的吗?我找不到PyQt4.9.1的任何教程。

1 个答案:

答案 0 :(得分:1)

data()没有任何value参数,但删除它并不能解决问题。

每当需要创建index(row, column, parent)时调用的虚方法QModelIndex总是返回QStandardItemModel的无效索引,除非明确创建了QStandardItem请求的索引。

表示视图可能不会在索引无效时尝试显示单元格,因此永远不会调用data()

如果继续从QStandardItemModel继承,则需要重新实现index()来创建有效索引,但由于您使用自己的结构来存储数据而不是使用QStandardItem,你可以简单地从QtCore.QAbstractTableModel继承:

class TestModel(QtCore.QAbstractTableModel):
    def __init__(self,parent=None):
        super(TestModel, self).__init__(parent)
        self.initData()
        self.headings = ['name','value','']

    def initData(self):
        self.rows = [['name {0}'.format(i), i] for i in range(20)]

    def data(self, index, role):
        if index.parent().isValid():
            return None             
        if (role == QtCore.Qt.DisplayRole):
            row = index.row()
            col = index.column()
            # 3rd column index is 2 not 3
            if  (col == 2):
                return "BUTTON GOES HERE"
            # that return should also be "inside" the role DisplayRole
            return self.rows[row][col]
        return None

    def headerData(self,section,orientation,role):
        if (role == QtCore.Qt.DisplayRole):
            if (orientation == QtCore.Qt.Horizontal):
                return self.headings[section]

此外,如果您不表示树模型,则应仅为顶级项(没有父项的项)返回非零行/列计数:

    def rowCount(self,parent):
        if not parent.isValid():
            return len(self.rows)
        return 0

    def columnCount(self,parent):
        if not parent.isValid():
            return 3
        return 0