这不是一个问题,而是一个解释请求.我正在关注Mark Summerfield的"使用Python和Qt进行快速GUI编程",我一定错过了一些东西,因为我无法理解以下机制将我正在使用的真实"instance_item"链接在一起并且充满各种类型为方便起见,数据和"widget_item"在QTreeWidget模型中表示它.
设置:
widget_item.setData(0, Qt.UserRole, QVariant(long(id(instance_item))))
Run Code Online (Sandbox Code Playgroud)
入门
widget_item.data(0, Qt.UserRole).toLongLong()[0]
Run Code Online (Sandbox Code Playgroud)
东西似乎toLongLong()根本不是"Pythonic",为什么我们调用Qt.UserRole和QVariant?是"setData"和"data"函数是Qt框架的一部分还是更普通的Python命令?
至少有2个更好的解决方案.为了增加pythonicity:
1)你不需要很这么多的数据类型包装
widget_item.setData(0, Qt.UserRole, QVariant(instance_item))
widget_item.data(0, Qt.UserRole).toPyObject()
Run Code Online (Sandbox Code Playgroud)
2)PyQt4有一个替代API,其中QVariant被废除,而来自QVariant的转换也是透明的.要启用它,您需要在任何PyQt4导入语句之前添加以下行:
import sip
sip.setapi('QVariant', 2)
Run Code Online (Sandbox Code Playgroud)
然后,您的代码如下所示:
widget_item.setData(0, Qt.UserRole, instance_item)
widget_item.data(0, Qt.UserRole) # original python object
Run Code Online (Sandbox Code Playgroud)
请注意,还有一个选项sip.setapi('QString', 2)可以使用QString,您可以使用unicode.
所有这些方法——setData()、data()、toLongLong() 都是 Qt 的一部分,最初打算在 C++ 中使用,在那里它们更有意义。我不太确定作者在这里想做什么,但如果你发现自己在做一些非常非 Pythonic 的事情,那么可能有更好的方法:
## The setter:
widget_item.instance_item = instance_item
## The getter:
instance_item = widget_item.instance_item
Run Code Online (Sandbox Code Playgroud)
Qt 文档当然不能推荐这个,因为 C++ 中没有动态属性分配。有一些非常具体的实例,您可能不得不处理 QVariant 和其他类似的废话(例如,通过 QtSQL 处理数据库时),但它们非常罕见。