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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTreeWidget и выделение  (Прочитано 8862 раз)
ZeBriD
Гость
« : Август 23, 2009, 19:57 »

Доброго времени суток.
Может просто уже поздно и голова уже совсем не варит, поэтому и не могу сообразить... Непонимающий Но подскажите, люди добрые, как можно оптимизировать по-человечески указанный ниже процесс ? Без лишних итераций и дублирования проверок / обработок... В замешательстве

Вот в чём суть:
Мне необходимо обрабатывать каждое изменение выделения в QTreeWidget'e после клика по элементу / изменению выделения элемента (с клавиатуры, теми же курсорами), дабы выделять все дочерние элементы и после обработать все выделеные элементы. Собственно, пока, обрабатываются по отдельности 2 сигнала: itemClicked(QTreeWidgetItem*,int) и currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*), соответственно дублирующие по сути друг друга, но с несколькими нюансами:
1) Использовать ItemSelectionChanged() я не могу, т.к. при изменении я рекурсивно выделяю / снимаю выделение со всех дочерних элементов. А после изменений обрабатываю все выделенные элементы. Соответственно, если использовать этот сигнал, будет произведена куча обработок, которые мне нужны только в конце процесса выделения, а не на протяжении всего такового...
2) Избавиться от itemClicked не могу, т.к. элемент может не меняться при повторном клике, а вот выделение изменится
3) Избавиться от currentItemChanged тоже не могу, т.к. изменени выделения может происходить и с клавиатуры...

Надеюсь, более-менее понятно изложил суть... Строит глазки
Записан
spectre71
Гость
« Ответ #1 : Август 24, 2009, 09:28 »

Вариант 1
 наследовать QItemSelectionModel и переопределить
virtual void select ( const QModelIndex & index, QItemSelectionModel::SelectionFlags command )
virtual void select ( const QItemSelection & selection, QItemSelectionModel::SelectionFlags command )

Вариант 2
  использовать void selectionChanged ( const QItemSelection & selected, const QItemSelection & deselected )
Но делать  всвоем слоте onMySelectionChanged  примерно так 

onMySelectionChanged {
  if(LockSelectionChanged) {return;}
  LockSelectionChanged++;
...
...
...
  LockSelectionChanged--;
}
Записан
ZeBriD
Гость
« Ответ #2 : Август 24, 2009, 09:57 »

Спасибо за идею... Вечером буду дома - попробую 2ой вариант. Не получится, придётся видимо, переопределять QItemSelectionModel
Записан
andrew.k
Гость
« Ответ #3 : Июнь 29, 2010, 10:02 »

Спасибо за идею... Вечером буду дома - попробую 2ой вариант. Не получится, придётся видимо, переопределять QItemSelectionModel
Возможно тебя еще заинтересует blockSignals, который позволяет заблокировать эмитирование сигналов у заданного объекта.
Записан
andrew.k
Гость
« Ответ #4 : Июнь 29, 2010, 10:07 »

У меня другой вопрос.
У меня есть список элементов, который обновляется раз в секунду например. Как сделать обновление незаметным для пользователя.
Если делать clear и каждый раз по новой формировать список. Теряется текущее выделение. Как его сохранить?
Или как выделить элемент списка зная его индекс?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Июнь 29, 2010, 10:31 »

Цитировать
Если делать clear и каждый раз по новой формировать список.
Это, конечно, самый простой способ обновить содержимое, но я бы сказал не совсем верный.
Многие проблемы пропадут, если помечать все элементы списка как invalidated.
Далее при добавлении новых элементов проверять наличие такого же и если таковой имеется, то
сбрасывать у него invalidated состояние. После чего удалить оставшиеся invalidated элементы.

Цитировать
Или как выделить элемент списка зная его индекс?
Код
C++ (Qt)
treeWidget->selectionModel()->select( treeWidget->model()->index( row, 0 ),
    QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows );
« Последнее редактирование: Июнь 29, 2010, 10:39 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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