这不是一个问题,因为它是一个解释请求。我正在关注Mark Summerfield的“使用Python和Qt进行快速GUI编程”,我一定错过了一些东西,因为我无法理解以下机制将我正在使用的真实“instance_item”链接在一起并且充满了各种类型为方便起见,数据和“widget_item”在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?是“setData”和“data”函数是Qt框架的一部分还是一个更通用的Python命令?
答案 0 :(得分:8)
至少有2个更好的解决方案。为了增加pythonicity:
1)您不需要完全这么多的数据类型打包
widget_item.setData(0, Qt.UserRole, QVariant(instance_item))
widget_item.data(0, Qt.UserRole).toPyObject()
2)PyQt4有一个替代API,其中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。
答案 1 :(得分:4)
所有这些方法--setData(),data(),toLongLong()都是Qt的一部分,最初打算用在C ++中,它们更有意义。我不太确定作者在这里尝试做什么,但是如果你发现自己做了非常恐怖的事情,那么可能有更好的方法:
## The setter:
widget_item.instance_item = instance_item
## The getter:
instance_item = widget_item.instance_item
当然,Qt文档不能推荐这个,因为C ++中没有动态属性赋值。当你可能不得不处理QVariant和其他类似的废话时(例如,通过QtSQL处理数据库时),有一些非常具体的例子,但它们非常罕见。