如何从PyQt4中的QVariant中获取我的Python对象?

6 投票
2 回答
5172 浏览
提问于 2025-04-15 19:43

我正在创建一个 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

撰写回答