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 命令?

4

2 回答 2

10

至少有 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。

于 2012-07-20T03:03:35.230 回答
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 处理数据库时),但它们非常罕见。

于 2012-07-14T16:21:55.703 回答