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

时间:2012-07-14 16:04:59

标签: python pyqt pyqt4

这不是一个问题,因为它是一个解释请求。我正在关注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命令?

2 个答案:

答案 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处理数据库时),有一些非常具体的例子,但它们非常罕见。