Несоответствие данных qtreeview - PullRequest
0 голосов
/ 04 октября 2011

У меня есть графический интерфейс QTreeView на основе editabletreemode.py в примерах PyQt. Внутри модели я заново реализовал setData () для своих нужд: для какого-то внешнего значения я возвращаю False, в противном случае возвращается True

def setData(self, index, value, role=QtCore.Qt.EditRole):
    if role != QtCore.Qt.EditRole:
        return False

    item = self.getItem(index)
    result = item.setData(index.column(), value)

    if result:
        self.dataChanged.emit(index, index)
        self.modified = True

    print "setData() returning ", result
    return result

Проблема в том, что даже когда setData возвращает False, GUI по-прежнему принимает измененное значение. Так что теперь у меня есть противоречивые данные между моделью и представлением. Для меня имеет смысл то, что когда setData () возвращает False для отклонения значения, представление должно возвращаться к старому значению. Возможно ли это?

[решено] На самом деле возвращаемое значение setData () не имеет значения. Кажется, QTreeView вызывает data () для повторного получения значения в любом случае. Проблема, с которой я столкнулся, заключалась в том, что setData () изменила внутренние данные, хотя и вернула False.

Если бы кто-нибудь мог объяснить мне, для чего используется возвращаемое значение setData (), это было бы здорово.

1 Ответ

1 голос
/ 04 октября 2011

Единственная проблема, которую я вижу, это подпись .setData(), которая .setData(index, value, role).Ни ваш фрагмент кода, ни описание вашей проблемы не достаточно многословны, чтобы сказать что-либо еще.

Редактировать: Действительно, после просмотра источников Qt я исправлен.В отличие от того, что я уже говорил до этого редактирования, возвращаемое значение .setData() фактически не используется представлением.

Данные передаются в модель .setModelData() делегата.Обычно Qt использует QStyledItemDelegate, метод которого .setModelData() фактически игнорирует возвращаемое значение .setData().Таким образом, представление действительно не заботится о том, были ли данные успешно установлены.Когда редактор для ячейки в представлении закрыт, представление просто отображает то, что сейчас является значением этой ячейки (полученное с помощью .data()).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...