【问题标题】:Setting and getting "data" from PyQt widget items?从 PyQt 小部件项目中设置和获取“数据”?
【发布时间】:2013-04-13 04:53:28
【问题描述】:

这与其说是一个问题,不如说是一个解释请求。我正在关注 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”指的是树中的列,在使用列表时不是必需的。我明白那部分。

标签: python pyqt pyqt4


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    所有这些方法——setData()、data()、toLongLong() 都是 Qt 的一部分,最初打算在 C++ 中使用,在 C++ 中它们更有意义。我不太确定作者在这里试图做什么,但如果你发现自己在做一些非常不符合 Python 的事情,可能有更好的方法:

    ## The setter:
    widget_item.instance_item = instance_item
    
    ## The getter:
    instance_item = widget_item.instance_item
    

    当然,Qt 文档不推荐这样做,因为 C++ 中没有动态属性分配。在一些非常具体的情况下,您可能不得不处理 QVariant 和其他类似的废话(例如,通过 QtSQL 处理数据库时),但它们非常罕见。

    【讨论】:

    • 这在拖放到新 QListWidget 时是否仍然存在?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多