代码之家  ›  专栏  ›  技术社区  ›  Didier Trosset

如何从pyqt4中的qvariant中获取python对象?

  •  5
  • Didier Trosset  · 技术社区  · 15 年前

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

    我的 index() parent() 函数创建 QModelIndex 使用 Qabstratem模型 继承的函数 createIndex 并提供 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>"
    

    索引() , 父级() data() 函数,我需要取回我的数据。它作为一个 QVariant . 如何从qvariant中获取python对象?

    2 回复  |  直到 10 年前
        1
  •  12
  •   Mark E. Haase    10 年前

    你试过这个吗?

    my_python_object = my_qvariant.toPyObject()
    

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

        2
  •  4
  •   Didier Trosset    15 年前

    关键是要用 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