PySide & Python3: Слот с QListWidgetItem създава грешен тип?

Седя пред проблем, който ме побърква. Може би е лесно, но не виждам виновника.

Имам прост клас, който свързва сигнала currentItemChanged на QListWidget с персонализиран слот от същия клас. Този сигнал има подпис (QListWidgetItem*, QListWidgetItem*) (няма претоварени сигнали със същото име). Слотът само един 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'> - това е напълно добре, така че полученият "елемент" отново е QListWidgetItem. Извикването на метода за данни изглежда подходящо за мен - някой има ли идея?


person nerdoc    schedule 09.06.2013    source източник


Отговори (1)


О, БОЖЕ МОЙ. Бях толкова зает да намеря отговора от страната на слота, че не видях гората сред всички дървета...

Подписът за свързване е грешен. Извиквах слота, вместо да го предам на манипулатора на сигнала:

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

реши проблема. Понякога е добре да хвърлите въпрос в дивата природа. Помага ви да се отдръпнете и да пренебрегнете какво сте направили ;-)

person nerdoc    schedule 10.06.2013