如何从PyQt4中的QVariant恢复我的python对象?

Did*_*set 5 python qvariant pyqt4 qabstractitemmodel

我正在创建一个QAbstractItemModel要显示的子类QTreeView.

index()parent()函数创建QModelIndex使用QAbstractItemModel继承功能createIndex,并提供它row,columndata需要.这里,出于测试目的,数据是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>"
Run Code Online (Sandbox Code Playgroud)

index(),parent()data()功能我需要让我的数据备份.它来自一个QVariant.如何从QVariant中恢复我的Python对象?

Ben*_*end 12

你试过这个吗?

my_python_object = my_qvariant.toPyObject()
Run Code Online (Sandbox Code Playgroud)

http://pyqt.sourceforge.net/Docs/PyQt4/qvariant.html#toPyObject(只是为了完整性,但没有太多东西可以看到......)


Did*_*set 5

关键是internalPointer()直接在 上使用QModelIndex,根本不用处理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
Run Code Online (Sandbox Code Playgroud)