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

Rod*_*Day 5 python pyqt pyqt4

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

Chr*_*isB 8

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


Luk*_*uke 5

所有这些方法——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 处理数据库时),但它们非常罕见。