Название: Как подсветить элемент дерева QTreeView зная его QModelIndex? Отправлено: xintrea от Январь 28, 2014, 22:41 Сейчас делаю Drag and Drop на ветках дерева.
Стоит задача - подсвечивать элемент дерева, над которым проходит курсор (mouse over). В dragMoveEvent() я могу получить элемент дерева, над которым проносят курсор: Код: void KnowTreeView::dragMoveEvent(QDragMoveEvent *event) И вот непонятно, как этот элемент, индекс которого известен, подсветить? Например, хочу понять как заменить ему цвет фона. Сейчас вижу только монструозный путь: в модели данных завести еще одно поле для элемента (что-то типа bool cursorOver), для чего придется переопределять метод setData() модели. А в переопределенном методе data() модели возвращать нужный цвет фона при запросе роли Qt::BackgroundRole. Но это как-то очень жутко получается - хранить флаг нахождения курсора мышы над элементом в данных элемента. Еще стоит вопрос как снимать этот флаг когда курсор покидает границы элемента. Можно ли сделать выделение элемента, над которым находится курсор мыши, более простым способом? Название: Re: Как подсветить элемент дерева QTreeView зная его QModelIndex? Отправлено: kambala от Январь 29, 2014, 00:27 я в своем тестовом проекте (https://github.com/kambala-decapitator/qt-true-dnd-move) именно так монструозно и делал для подсветки ячеек таблицы над которыми двигается картинка, на форуме никто ничего лучше не подсказал. там же есть и решение для покидания границ (в dragLeaveEvent запускается 100 мс-таймер, после окончания которого проверяется осуществляется ли еще драг).
Название: Re: Как подсветить элемент дерева QTreeView зная его QModelIndex? Отправлено: Igors от Январь 29, 2014, 10:47 А ничего лучшего и нет, как показали мои недавние изыскания. Проблема в том что "подсветка" - операция растровая и рисованием не поддерживается. Др словами можно писать но не читать
Название: Re: Как подсветить элемент дерева QTreeView зная его QModelIndex? Отправлено: Old от Январь 29, 2014, 10:48 Я бы попробовал поиграться с делегатами, что бы модель не коробить.
Название: Re: Как подсветить элемент дерева QTreeView зная его QModelIndex? Отправлено: Fregloin от Январь 29, 2014, 10:49 void QAbstractItemView::entered(const QModelIndex & index) [signal] попробовать?
Название: Re: Как подсветить элемент дерева QTreeView зная его QModelIndex? Отправлено: kambala от Январь 29, 2014, 13:13 и как это поможет? индекс-то и так известен во время перемещения, а модель «рисует» в data()
Название: Re: Как подсветить элемент дерева QTreeView зная его QModelIndex? Отправлено: Igors от Январь 29, 2014, 16:31 Есть QStyle::State_MouseOver, может там покопать.
Название: Re: Как подсветить элемент дерева QTreeView зная его QModelIndex? Отправлено: xintrea от Февраль 03, 2014, 20:19 А ничего лучшего и нет, как показали мои недавние изыскания. Проблема в том что "подсветка" - операция растровая и рисованием не поддерживается. Др словами можно писать но не читать Я, в принципе, сделал подсветку через setData() и возвращения нужного цвета фона в data(). Сейчас перекрашиваются ветки, над которыми проносят курсор. Проблема в том, что вид QTreeView не запрашивает данные модели, когда курсор проносят над элементами. И закраска элементов видна уже после драг-анд-дропа. Как быть? Название: Re: Как подсветить элемент дерева QTreeView зная его QModelIndex? Отправлено: kambala от Февраль 03, 2014, 20:21 попробуй вызывать viewport()->update() в dragMoveEvent()
Название: Re: Как подсветить элемент дерева QTreeView зная его QModelIndex? Отправлено: Igors от Февраль 04, 2014, 09:47 QAbstractItemDelegate::paint [virtual] - получает QStyleOptionViewItem в котором может быть установлен QStyle::State_MouseOver. Идеально было бы просто подменить палетку по этому флагу. Ну сначала надо попечатать приходит ли сам флаг
Название: Re: Как подсветить элемент дерева QTreeView зная его QModelIndex? Отправлено: Old от Февраль 04, 2014, 11:10 QAbstractItemDelegate::paint [virtual] - получает QStyleOptionViewItem в котором может быть установлен QStyle::State_MouseOver. Идеально было бы просто подменить палетку по этому флагу. Ну сначала надо попечатать приходит ли сам флаг Даже если он не устанавливается (хотя не вижу причин), всегда можно по координатам рисуемого элемента определить над ним мышь или нет. |