我正在试图弄清楚如何使用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的任何教程。
答案 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