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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как подсветить элемент дерева QTreeView зная его QModelIndex?  (Прочитано 5995 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Январь 28, 2014, 22:41 »

Сейчас делаю Drag and Drop на ветках дерева.

Стоит задача - подсвечивать элемент дерева, над которым проходит курсор (mouse over).

В dragMoveEvent() я могу получить элемент дерева, над которым проносят курсор:

Код:
void KnowTreeView::dragMoveEvent(QDragMoveEvent *event)
{
 if( isDragableData(event) )
  {
   // Выясняется элемент дерева, над которым находится курсор
   QModelIndex index=indexAt(event->pos());
...

И вот непонятно, как этот элемент, индекс которого известен, подсветить? Например, хочу понять как заменить ему цвет фона.

Сейчас вижу только монструозный путь: в модели данных завести еще одно поле для элемента (что-то типа bool cursorOver), для чего придется переопределять метод setData() модели. А в переопределенном методе data() модели возвращать нужный цвет фона при запросе роли Qt::BackgroundRole.

Но это как-то очень жутко получается - хранить флаг нахождения курсора мышы над элементом в данных элемента. Еще стоит вопрос как снимать этот флаг когда курсор покидает границы элемента.

Можно ли сделать выделение элемента, над которым находится курсор мыши, более простым способом?
Записан

Собираю информацию по крупицам
http://webhamster.ru
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Январь 29, 2014, 00:27 »

я в своем тестовом проекте именно так монструозно и делал для подсветки ячеек таблицы над которыми двигается картинка, на форуме никто ничего лучше не подсказал. там же есть и решение для покидания границ (в dragLeaveEvent запускается 100 мс-таймер, после окончания которого проверяется осуществляется ли еще драг).
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Январь 29, 2014, 10:47 »

А ничего лучшего и нет, как показали мои недавние изыскания. Проблема в том что "подсветка" - операция растровая и рисованием не поддерживается. Др словами можно писать но не читать
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Январь 29, 2014, 10:48 »

Я бы попробовал поиграться с делегатами, что бы модель не коробить.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #4 : Январь 29, 2014, 10:49 »

void QAbstractItemView::entered(const QModelIndex & index) [signal] попробовать?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Январь 29, 2014, 13:13 »

и как это поможет? индекс-то и так известен во время перемещения, а модель «рисует» в data()
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Январь 29, 2014, 16:31 »

Есть QStyle::State_MouseOver, может там покопать.
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #7 : Февраль 03, 2014, 20:19 »

А ничего лучшего и нет, как показали мои недавние изыскания. Проблема в том что "подсветка" - операция растровая и рисованием не поддерживается. Др словами можно писать но не читать

Я, в принципе, сделал подсветку через setData() и возвращения нужного цвета фона в data(). Сейчас перекрашиваются ветки, над которыми проносят курсор.

Проблема в том, что вид QTreeView не запрашивает данные модели, когда курсор проносят над элементами. И закраска элементов видна уже после драг-анд-дропа. Как быть?
Записан

Собираю информацию по крупицам
http://webhamster.ru
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #8 : Февраль 03, 2014, 20:21 »

попробуй вызывать viewport()->update() в dragMoveEvent()
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Февраль 04, 2014, 09:47 »

QAbstractItemDelegate::paint [virtual] - получает QStyleOptionViewItem в котором может быть установлен QStyle::State_MouseOver. Идеально было бы просто подменить палетку по этому флагу. Ну сначала надо попечатать приходит ли сам флаг
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #10 : Февраль 04, 2014, 11:10 »

QAbstractItemDelegate::paint [virtual] - получает QStyleOptionViewItem в котором может быть установлен QStyle::State_MouseOver. Идеально было бы просто подменить палетку по этому флагу. Ну сначала надо попечатать приходит ли сам флаг
Даже если он не устанавливается (хотя не вижу причин), всегда можно по координатам рисуемого элемента определить над ним мышь или нет.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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