QTreeView 的 QAbstractItemModel:我做错了什么?
QAbstractItemModel for QTreeView: what an I doing wrong?
我想创建一个子类 a QAbstractItemModel
以便在 QTreeView
中使用它。起初,我决定制作一个不支持任何层次结构的简约模型。它应该给出一个 2×3 table 和简单的文本数据(read-only 一个)。
唉,它没有崩溃但没有显示任何数据:只有几列 headers (1, 2)。不能有人告诉我,我做错了什么吗?
import os, sys
from PyQt5 import QtWidgets, QtCore, QtGui, QtSvg
from PyQt5.QtCore import QPointF, QRectF
from PyQt5.QtWidgets import QGraphicsItem
from gui.graphic_items import *
class MegaModel(QtCore.QAbstractItemModel):
def __init__(self, parent=None):
super().__init__(parent)
self._root_item = 7.40
pass
def columnCount(self, parent_index):
if parent_index.isValid():
return 0
else:
return 2
def rowCount(self, parent_index):
if parent_index.isValid():
return 0
else:
return 3
def data(self, index, role):
if index.isValid():
return QtCore.QVariant("Oy vey!")
else:
return None
def index(self, row, column, parent=QtCore.QModelIndex()):
print("index", row, column, parent)
if parent.isValid():
print("valid")
return parent.internalPointer()
else:
print("invalid")
return self.createIndex(row, column, self._root_item)
def parent(self, index):
return QtCore.QModelIndex()
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
mega_view = QtWidgets.QTreeView()
mega_model = MegaModel()
mega_view.setModel(mega_model)
mega_view.show()
sys.exit(app.exec_())
两个错误:
- 您不应该 return
parent.internalPointer()
来自 index
方法 - 此方法不 return 模型的存储值,它仅用于 return 模型项目的索引
在 data
方法中,您 return QtCore.QVariant("Oy vey!")
用于所有角色。对于 QtCore.Qt.DisplayRole
,您真的应该只 return 这个,对于其他角色,return None
:
是可以的
def data(self, index, role):
if not index.isValid():
return None
if role == QtCore.Qt.DisplayRole:
return index.internalPointer()
else:
return None
我想创建一个子类 a QAbstractItemModel
以便在 QTreeView
中使用它。起初,我决定制作一个不支持任何层次结构的简约模型。它应该给出一个 2×3 table 和简单的文本数据(read-only 一个)。
唉,它没有崩溃但没有显示任何数据:只有几列 headers (1, 2)。不能有人告诉我,我做错了什么吗?
import os, sys
from PyQt5 import QtWidgets, QtCore, QtGui, QtSvg
from PyQt5.QtCore import QPointF, QRectF
from PyQt5.QtWidgets import QGraphicsItem
from gui.graphic_items import *
class MegaModel(QtCore.QAbstractItemModel):
def __init__(self, parent=None):
super().__init__(parent)
self._root_item = 7.40
pass
def columnCount(self, parent_index):
if parent_index.isValid():
return 0
else:
return 2
def rowCount(self, parent_index):
if parent_index.isValid():
return 0
else:
return 3
def data(self, index, role):
if index.isValid():
return QtCore.QVariant("Oy vey!")
else:
return None
def index(self, row, column, parent=QtCore.QModelIndex()):
print("index", row, column, parent)
if parent.isValid():
print("valid")
return parent.internalPointer()
else:
print("invalid")
return self.createIndex(row, column, self._root_item)
def parent(self, index):
return QtCore.QModelIndex()
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
mega_view = QtWidgets.QTreeView()
mega_model = MegaModel()
mega_view.setModel(mega_model)
mega_view.show()
sys.exit(app.exec_())
两个错误:
- 您不应该 return
parent.internalPointer()
来自index
方法 - 此方法不 return 模型的存储值,它仅用于 return 模型项目的索引 在
是可以的data
方法中,您 returnQtCore.QVariant("Oy vey!")
用于所有角色。对于QtCore.Qt.DisplayRole
,您真的应该只 return 这个,对于其他角色,returnNone
:def data(self, index, role): if not index.isValid(): return None if role == QtCore.Qt.DisplayRole: return index.internalPointer() else: return None