Python “设置和获取”;“数据”;从PyQt小部件项?

Python “设置和获取”;“数据”;从PyQt小部件项?,python,pyqt,pyqt4,Python,Pyqt,Pyqt4,这与其说是一个问题,不如说是一个要求解释的问题。我正在学习Mark Summerfield的“使用Python和Qt进行快速GUI编程”,我肯定错过了一些东西,因为我无法理解以下机制,即将我正在使用的、充满各种类型数据的真实“实例项”与“小部件项”链接在一起,为了方便起见,“小部件项”在QTreeWidget模型中表示它 设置: widget_item.setData(0, Qt.UserRole, QVariant(long(id(instance_item)))) 得到 widget_it

这与其说是一个问题,不如说是一个要求解释的问题。我正在学习Mark Summerfield的“使用Python和Qt进行快速GUI编程”,我肯定错过了一些东西,因为我无法理解以下机制,即将我正在使用的、充满各种类型数据的真实“实例项”与“小部件项”链接在一起,为了方便起见,“小部件项”在QTreeWidget模型中表示它

设置:

widget_item.setData(0, Qt.UserRole, QVariant(long(id(instance_item))))
得到

widget_item.data(0, Qt.UserRole).toLongLong()[0]
toLongLong()
这样的东西看起来一点都不“Pythonic”,为什么我们要调用Qt.UserRole和QVariant?“StDATA”和“数据”是QT框架的一部分,还是一个更一般的Python命令?

< P>所有这些方法——SETDATA()、DATA()、TROUNGONE()都是QT的一部分,最初打算用于C++,在那里它们有更大的意义。我不确定作者在这里想做什么,但如果你发现自己做了一些非常不符合Python的事情,可能有更好的方法:

## The setter:
widget_item.instance_item = instance_item

## The getter:
instance_item = widget_item.instance_item

< Q>文档不能推荐这一点,因为C++中没有动态属性分配。有一些非常具体的例子,您可能需要处理QVariant和其他类似的废话(例如,通过QtSQL处理数据库时),但它们非常罕见。

至少有两种更好的解决方案。按肾盂性增加的顺序:

1) 您不需要太多的数据类型打包

widget_item.setData(0, Qt.UserRole, QVariant(instance_item))
widget_item.data(0, Qt.UserRole).toPyObject()
2) PyQt4有一个替代API,其中QVariant被删除,从QVariant到QVariant的转换是透明的。要启用它,需要在任何PyQt4导入语句之前添加以下行:

import sip
sip.setapi('QVariant', 2)
然后,您的代码如下所示:

widget_item.setData(0, Qt.UserRole, instance_item)
widget_item.data(0, Qt.UserRole)  # original python object

请注意,还有一个选项
sip.setapi('QString',2)
,其中QString已被删除,您可以使用unicode代替。

哦,是的,“0”表示树中的列,在使用列表时不需要。我确实理解这一部分。通过拖放到新的QListWidget,这种情况会持续吗?