Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Tonal от Сентябрь 03, 2007, 08:32



Название: [Qt 4.3.1] QtTableView и множественное удаление
Отправлено: Tonal от Сентябрь 03, 2007, 08:32
При реализации множественного удаления наткнулись на некоторые странности:
1) Событие смены текущего приходит не по окончанию удаления а во время оповещения о начале удаления
2) При оповещении о начале удаления QSortFilterProxyModel выкидывает сразу и событие об окончании изменений.

Мы, конечно, блакируем интерфейс во время изменений (setUpdatesEnabled(false)), но вот на событие смены текущего иногда завязано довольно много действий.
И очень неудачно, когда текущим становится элемент, которого уже нет...

Кто-нибудь натыкался на подобное?
Какие идеи как обойти?

Собственно псевдо-код отработки удаления в модели (python):
Код:
  def _inner_data_dels(self, oids):
    u"""
    Обработка удаления объектов.
    @param oids идентификаторы удалённых объектов
    """
    #{0}
    #Находим номера всех удаляемых строк
    rows = set(
      row for row in (self._indexByOid(oid) for oid in oids)
      if row is not None)
    #{1}
    #Оповещаем о том, что указанные строки сейчас будут удалены
    for row in sorted(rows):
      self.beginRemoveRows(QtCore.QModelIndex(), row, row)
    #{2}
    #Удаляем
    for row in sorted(rows, reverse=True):
      del self.objects[row]
    #{3}
    #Оповещаем о том, что удаление закончилось
    for row in rows:
      self.endRemoveRows()
Описанные "странности" происходят в строках между {1} и {2}.


Название: Re: [Qt 4.3.1] QtTableView и множественное удаление
Отправлено: Пантер от Сентябрь 03, 2007, 11:24
Извини, если слишком глупо помогу, но можно перед удаление запомнить курсор, установить курсор на не удаляемый элемент, вернуть курсор, если не удален.


Название: Re: [Qt 4.3.1] QtTableView и множественное удаление
Отправлено: Tonal от Сентябрь 03, 2007, 11:46
Смену фокуса я пока обошел другим методом - собираю удалённые строки в непрерывные пачки и выдаю уведомление именно для пачек.
При этом Qt вроде коректно устанавливает текущий.

И всё равно, остались сомнения в правильности поведения Qt в этом случае.
По идее, событие смены текущего элемента должно происходить после того, как обновление закончено...
То же и с фильтрацией...


Название: Re: [Qt 4.3.1] QtTableView и множественное удаление
Отправлено: Пантер от Сентябрь 03, 2007, 11:50
По идее, событие смены текущего элемента должно происходить после того, как обновление закончено...
Почему? Курсор, на сколько я знаю, элемент не графический, поэтому обновляться должен всегда. Хотя не уверен.