Получение данных из QModelIndex вызывает бесконечный цикл - PullRequest
1 голос
/ 25 декабря 2011

У меня проблемы с классом, который реализует __getitem__ и __setitem__.

Экземпляры этого класса являются бэкэндом данных QAbstractListModel.Я возвращаю эти экземпляры в реализации data(index) модели, когда role==Qt.UserRole, чтобы иметь возможность доступа к объекту извне модели.

Один сценарий, где я хочу сделать это, - когда пользователь нажимает налюбой элемент в QListView, который использует мою модель для отображения данных.Проблема в том, что моя программа начинает работать в бесконечном цикле (в пределах __getattr__), как только я пытаюсь извлечь данные из индекса, по которому щелкнул пользователь.

Ниже приведена полная копия/ Вставляемый фрагмент кода, который воспроизводит описанное поведение.Программа зациклится в строке index.data(Qt.UserRole) из testfunc.

Я пропустил где-нибудь точку или обнаружил ошибку в PySide?

#!/usr/bin/python

from PySide.QtCore import QAbstractListModel, Qt, QObject
from PySide.QtGui import QApplication, QListView

import sys

###############################################################################

class TestObject(QObject):
    def __init__(self, parent=None):
        """Creates new instance of TestObject.
        @param parent Qt parent."""
        super(TestObject, self).__init__(parent)
        self._data = {}

    def __getitem__(self, key):
        """Gets an item from self._data"""
        if key in self._data.keys():
            return self._data[key]

    def __setitem__(self, key, value):
        """Sets the value for key."""
        self._data[key] = value

###############################################################################

class TestModel(QAbstractListModel):
    def __init__(self, parent=None):
        """Creates a new instance of TestModel.
        @param parent Qt parent."""
        super(TestModel, self).__init__(parent)
        self._objects = []
        for i in range(5):
            obj = TestObject(self)
            obj[i] = str(i)
            self._objects.append(obj)

    def rowCount(self, parent):
        """Returns the amount of datasets."""
        return len(self._objects)

    def columnCount(self):
        """Returns the amount of columns, which is 1."""
        return 1

    def data(self, index, role=Qt.DisplayRole):
        """Returns the data for the given model index"""
        if index.isValid():
            obj = self._objects[index.row()]
            if role == Qt.DisplayRole:
                return str(obj)
            elif role == Qt.UserRole:
                return obj
        return None

###############################################################################

def testfunc(index):
    """Does something with index."""
    print "getting..."
    index.data(Qt.UserRole)
    print "never getting here :/"

###############################################################################

if __name__ == "__main__":
    app = QApplication(sys.argv)
    view = QListView()
    view.setModel(TestModel())
    view.clicked.connect(testfunc)
    view.show()
    app.exec_()

Ответы [ 2 ]

0 голосов
/ 05 декабря 2012

__getitem__ необходимо поднять IndexError() при неверном ключе

0 голосов
/ 04 декабря 2012

Кажется, что PySide пытается перебрать ваши объекты (не могу сказать, почему).Как сказано в комментарии, вам нужно вызвать IndexError в __getitem__, чтобы остановить эту итерацию внутри PySide.

Информация о __getitem__ и итерации по объекту: https://stackoverflow.com/a/926645/812662

...