从PyQt小部件中设置和获取“数据”?

6
这不是一个问题,而是一个请求解释的要求。我正在跟随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”指的是树中的列,在使用列表时不是必需的。我理解那部分内容。 - RodericDay
2个回答

10

至少有两个更好的解决方案。按Pythonic程度递增排序:

1)您不需要使用那么多数据类型打包。

widget_item.setData(0, Qt.UserRole, QVariant(instance_item))
widget_item.data(0, Qt.UserRole).toPyObject()

2) PyQt4有另外一个API,其中QVariant被取消了,转换到-from 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 代替。

5

所有这些方法——setData()、data()和toLongLong()都是Qt的一部分,最初是用于C++中的,在那里它们更加合理。我不太确定作者在这里想做什么,但如果你发现自己做了一些非常不符合Python语言精神的事情,那么很可能有更好的方法:

## The setter:
widget_item.instance_item = instance_item

## The getter:
instance_item = widget_item.instance_item

Qt文档当然不能推荐这样做,因为在C++中没有动态属性赋值。有一些非常特定的情况,您可能需要处理QVariant和其他类似的无聊东西(例如,通过QtSQL处理数据库),但它们非常少见。

这个是否会在拖放到新的QListWidget上保持不变? - eziegl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接