PySide& Python3:带QListWidgetItem的Slot产生错误的类型?

时间:2013-06-09 23:57:24

标签: python python-3.x pyside signals-slots

我坐在一个让我疯狂的问题面前。也许这很容易,但我看不出罪魁祸首。

我有一个简单的类,它将QListWidget的currentItemChanged信号连接到同一个类的自定义槽。该信号具有(QListWidgetItem *,QListWidgetItem *)签名(没有具有相同名称的重载信号)。 Slot只有一个QListWidgetItem,应该没问题。 请参阅代码段:

class Overview(QObject):
    def __init__(self, parent=None)
    #---SNIP---
    item = QListWidgetItem(spec.name)
    item.setData(Qt.UserRole, spec)
    self.ui.listWidget.currentItemChanged.connect(
                    self.showDetails(QListWidgetItem))

    @Slot(QListWidgetItem)
    def showDetails(self, item):
        if item:
            spec = item.data(Qt.UserRole) # <---- PROBLEM

当我运行此代码时,我总是收到错误消息:

---SNIP---
    spec = item.data(Qt.UserRole)
TypeError: descriptor 'data' requires a 'PySide.QtGui.QListWidgetItem' object
but received a 'PySide.QtCore.Qt.ItemDataRole'

我尝试了一切,但我看不出这里有什么问题。 当我在插槽中填入print(item)时,它会显示:<class 'PySide.QtGui.QListWidgetItem'> - 这是完全正常的,因此收到的“item”再次是一个QListWidgetItem。数据方法调用似乎适合我 - 有人有想法吗?

1 个答案:

答案 0 :(得分:1)

OMG。 我忙着在插槽一侧找到答案,我没有看到所有树林中的森林......

连接签名错误。我正在调用插槽而不是将其传递给信号处理程序:

self.ui.listWidget.currentItemChanged.connect(self.showDetails)

解决了这个问题。 有时将问题抛到野外是件好事。帮助您退后一步,忽略您的所作所为; - )