Russian Qt Forum
Ноябрь 25, 2024, 00:01 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Qt 4.3.1] QtTableView и множественное удаление  (Прочитано 3282 раз)
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}.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Сентябрь 03, 2007, 11:24 »

Извини, если слишком глупо помогу, но можно перед удаление запомнить курсор, установить курсор на не удаляемый элемент, вернуть курсор, если не удален.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Tonal
Гость
« Ответ #2 : Сентябрь 03, 2007, 11:46 »

Смену фокуса я пока обошел другим методом - собираю удалённые строки в непрерывные пачки и выдаю уведомление именно для пачек.
При этом Qt вроде коректно устанавливает текущий.

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

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Сентябрь 03, 2007, 11:50 »

По идее, событие смены текущего элемента должно происходить после того, как обновление закончено...
Почему? Курсор, на сколько я знаю, элемент не графический, поэтому обновляться должен всегда. Хотя не уверен.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 23.