如何从PyQt4中的QVariant中获取我的Python对象?
我正在创建一个 QAbstractItemModel
的子类,目的是让它可以在 QTreeView
中显示。
我的 index()
和 parent()
函数使用从 QAbstractItemModel
继承来的 createIndex
函数来创建 QModelIndex
,并提供所需的 row
(行)、column
(列)和 data
(数据)。在这里,为了测试,数据是一个 Python 字符串。
class TestModel(QAbstractItemModel):
def __init__(self):
QAbstractItemModel.__init__(self)
def index(self, row, column, parent):
if parent.isValid():
return self.createIndex(row, column, "bar")
return self.createIndex(row, column, "foo")
def parent(self, index):
if index.isValid():
if index.data().data() == "bar": <--- NEVER TRUE
return self.createIndex(0, 0, "foo")
return QModelIndex()
def rowCount(self, index):
if index.isValid():
if index.data().data() == "bar": <--- NEVER TRUE
return 0
return 1
def columnCount(self, index):
return 1
def data(self, index, role):
if index.isValid():
return index.data().data() <--- CANNOT DO ANYTHING WITH IT
return "<None>"
在 index()
、parent()
和 data()
这些函数中,我需要把我的数据拿回来。它以 QVariant
的形式出现。我该如何从 QVariant 中获取我的 Python 对象呢?
2 个回答
13
你试过这个吗?
my_python_object = my_qvariant.toPyObject()
http://pyqt.sourceforge.net/Docs/PyQt4/qvariant.html#toPyObject(只是为了完整性,不过那里没什么特别的内容…)
5
关键是要直接在 QModelIndex
上使用 internalPointer()
,而不是去处理 QVariant
。
class TestModel(QAbstractItemModel):
def __init__(self, plan):
QAbstractItemModel.__init__(self)
def index(self, row, column, parent):
if not parent.isValid():
return self.createIndex(row, column, "foo")
return self.createIndex(row, column, "bar")
def parent(self, index):
if index.internalPointer() == "bar":
return self.createIndex(0, 0, "foo")
return QModelIndex()
def rowCount(self, index):
if index.internalPointer() == "bar":
return 0
return 1
def columnCount(self, index):
return 1
def data(self, index, role):
if role == 0: # Qt.DisplayRole
return index.internalPointer()
else:
return None