Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: ZeBriD от Август 23, 2009, 19:57



Название: QTreeWidget и выделение
Отправлено: ZeBriD от Август 23, 2009, 19:57
Доброго времени суток.
Может просто уже поздно и голова уже совсем не варит, поэтому и не могу сообразить... ??? Но подскажите, люди добрые, как можно оптимизировать по-человечески указанный ниже процесс ? Без лишних итераций и дублирования проверок / обработок... :-\

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

Надеюсь, более-менее понятно изложил суть... ::)


Название: Re: QTreeWidget и выделение
Отправлено: spectre71 от Август 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--;
}


Название: Re: QTreeWidget и выделение
Отправлено: ZeBriD от Август 24, 2009, 09:57
Спасибо за идею... Вечером буду дома - попробую 2ой вариант. Не получится, придётся видимо, переопределять QItemSelectionModel


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


Название: Re: QTreeWidget и выделение
Отправлено: andrew.k от Июнь 29, 2010, 10:07
У меня другой вопрос.
У меня есть список элементов, который обновляется раз в секунду например. Как сделать обновление незаметным для пользователя.
Если делать clear и каждый раз по новой формировать список. Теряется текущее выделение. Как его сохранить?
Или как выделить элемент списка зная его индекс?


Название: Re: QTreeWidget и выделение
Отправлено: GreatSnake от Июнь 29, 2010, 10:31
Цитировать
Если делать clear и каждый раз по новой формировать список.
Это, конечно, самый простой способ обновить содержимое, но я бы сказал не совсем верный.
Многие проблемы пропадут, если помечать все элементы списка как invalidated.
Далее при добавлении новых элементов проверять наличие такого же и если таковой имеется, то
сбрасывать у него invalidated состояние. После чего удалить оставшиеся invalidated элементы.

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