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

2024-09-24 22:22:24 发布

您现在位置:Python中文网/ 问答频道 /正文

与其说这是一个问题,不如说这是一个要求解释的问题。我在遵循Mark Summerfield的“使用Python和Qt的快速GUI编程”,我一定漏掉了一些东西,因为我无法理解以下机制,无法将我正在使用的、充满各种类型数据的真正“instance_item”和在QTreeWidget模型中表示它的“widget_item”链接起来,以方便使用。

设置:

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


Tags: 数据instancedata编程guiwidgetitemqt
2条回答

至少有两个更好的解决方案。为了增加脓毒性:

1)不需要太多的数据类型打包

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

2)PyQt4有一个备用API,QVariant不在这里,从QVariant到PyQt4的转换是透明的。要启用它,您需要在任何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代替。

所有这些方法——SETDATA()、DATA()、TROUNGONE()都是QT的一部分,最初打算在C++中使用,在那里它们有更大的意义。我不确定作者到底想在这里做什么,但如果你发现自己在做一些非常不符合Python的事情,也许有更好的方法:

## The setter:
widget_item.instance_item = instance_item

## The getter:
instance_item = widget_item.instance_item
< Q>文档不能推荐这一点,因为C++中没有动态属性分配。当你不得不处理QVariant和其他类似的废话时(例如,当你通过QtSQL处理数据库时),有一些非常具体的例子,但是它们非常罕见。

相关问题 更多 >