1

我试图弄清楚如何使用 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 时发生的情况:没有错误消息,表格的绘制行数和列数以及正确的标题,但表格是空的。您可能会注意到模型的 draw 方法以 print 语句开始。该声明从未达到。有什么我想念的吗?我根本找不到 PyQt4.9.1 的任何教程。

4

1 回答 1

1

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

每当需要创建index(row, column, parent)a 时调用的虚方法总是返回一个无效的索引,除非 a是为请求的索引显式创建的。当索引无效时,视图可能不会尝试显示单元格,因此永远不会被调用。QModelIndexQStandardItemModelQStandardItemdata()

如果您继续从 继承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
于 2012-06-01T23:14:26.240 回答