【问题标题】:How do I update the data associated with a QListWidgetItem from the QListWidget in PyQt?如何从 PyQt 中的 QListWidget 更新与 QListWidgetItem 关联的数据?
【发布时间】:2017-06-03 03:23:50
【问题描述】:

我有一个 QListWidget 有 10 个 QListWidgetItems。当每个 QListWidgetItems 创建时,我会执行以下操作:

item = QtGui.QListWidgetItem("Text to Show")
item.setData(36, "A specific value that is used later")
self.ui.my_list.addItem(item)

现在,稍后在应用程序中,在用户单击按钮后,我想为所选项目更新文本“稍后使用的特定值”。我已经尝试过这样做

ndx = self.ui.my_list.currentRow()
self.ui.my_list.item(ndx).setData(36, "Updated!")

问题是,这行不通。它不会抛出任何错误,但数据只是消失了。在我的按钮按下信号中,我有这段代码可以查看重新分配前后的值:

ndx = self.ui.my_list.currentRow()   
print "Before:", self.ui.my_list.item(ndx).data(36).toPyObject()
self.ui.my_list.item(ndx).setData(36, "Updated!")
print "After:", self.ui.my_list.item(ndx).data(36).toPyObject()

这个输出:

Before: A specific value that is used later
After:

如何正确更改数据以将其保存回QListWidgetItem

【问题讨论】:

  • 我没有发现任何问题。我可以想象两个错误来源:因为您的QListWidgetItem 连接到QListWidget,也许您有连接到覆盖值的更改信号的东西。如果您使用未连接到列表视图的QListWidgetItem,会发生什么情况?对我来说,它有效:pastebin.com/VSUithwZ 或者QVariant-conversion 可能发生了一些有趣的事情。它们的类型是什么?
  • 它是一个更大的应用程序的一部分,所以仅仅一个独立的 QListWidgetItem 是不可行的。我已经尝试使用字典(作为完整的应用程序使用)和我在此处发布的精简示例的字符串。两者都显示相同的结果。
  • 我还没有任何信号连接到 ListWidget。
  • 我写的代码呢?它在您的设置中有效吗?如果不是,你的 Qt 版本是什么?
  • @NewGuy。我无法重现这一点。我使用 PyQt-4.9.5、PyQt-4.10 和 PyQt-4.11.4 和 Qt-4.8.7 进行了测试。您正在使用的特定版本的 PyQ4 中似乎存在错误。您是否使用完全精简的最小示例进行了测试,该示例仅创建一个包含一个项目的列表小部件?您需要这样做以隔离问题并确认它是 PyQt4 中的错误,而不是您自己程序中的错误。

标签: python python-2.7 pyqt pyqt4


【解决方案1】:

您可能需要检查您使用的角色值是否是有效的用户角色,否则它可能会在内部被更改。我用 C++ 编写,但我经常使用 QListWidget 和 QListWidgetItem(s),这是我早期遇到的一个问题。我想无论语言如何,功能都是相似的。根据文档here,可以使用的第一个用户角色是0x0010。因此,要将其与您的示例联系起来,您可以尝试以下操作:

item.setData(0x0010, "稍后使用的特定值")

对于其他项目角色,您可以使用 0x0011、0x0012、0x0013 等。

【讨论】:

    猜你喜欢
    • 2011-12-17
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 2015-05-11
    相关资源
    最近更新 更多