Я присоединяю объект как UserData к QStandardItem, который добавляется в модель QComboBox. Если я буду искать его с помощью метода findData(), я не получаю никакого результата. Если я делаю то же самое с простым int, я получаю результат. Я полагаю, что это связано с PySide, но я не смог найти обертку в источнике. Вот (несколько) минимальный пример:Почему QComboBox.findData() не принимает объект как вход?
import sys
from PySide import QtGui
class Foo(object):
def __init__(self, value):
self.value = value
class MyCombo(QtGui.QWidget):
def __init__(self, *args):
QtGui.QWidget.__init__(self, *args)
combo = QtGui.QComboBox()
combo.addItem(str(1), Foo(1))
combo.addItem(str(2), 2)
data = combo.itemData(0)
print(data) # prints the object repr
print(combo.findData(data)) # returns -1 -> not found
data = combo.itemData(1)
print(data) # prints 2
print(combo.findData(data)) # returns 1 -> found
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
w = MyCombo()
w.show()
sys.exit(app.exec_())
Почему findData() возвращает -1 для объекта? Любые подсказки для того, что можно найти, оценены!
Это фактически ошибка (или, по крайней мере, отсутствует функция) в PySide и PyQt4. При сравнении пользовательских типов (таких как объекты python), 'QVariant' должен использовать адрес содержащегося значения. Это было исправлено в pyqt5, где пример OPs будет работать, как ожидалось. Я не знаю подробностей реализации, но я подозреваю, что специальный мета-тип зарегистрирован для обертывания типов python, поэтому они могут содержаться в 'QVariant'. Возможно, проблема заключается в том, что pyside/pyqt4 сравнивает адреса временных * wrappers *, а не содержащиеся значения. – ekhumoro
В этом случае ваш подход работает отлично, но, к сожалению, мой реальный код намного сложнее, и я не хочу подкласса QObject для решения. Теперь я делаю самые очевидные и повторяю элементы и сравниваю их, чтобы найти правильный элемент. Меня больше интересовала причина этого странного поведения, но ваш ответ и очень полезный комментарий @ ekhumoro помогли решить эту тайну! – Fookatchu