Название: 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 элементы. Цитировать Или как выделить элемент списка зная его индекс? Код
|