LINUX.ORG.RU

Как подсветить элемент дерева QTreeView зная его QModelIndex?

 


0

2

Сейчас делаю 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.

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

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

★★★★★

CSS :hover :active

Но для тривива я это не делал. QLabel QTab мучал, на табахкак раз id активного таба стилизовал стилем. Не забуду если; позже код гляну, но он легко гуглится

minakov ★★★★★
()

гугли про QItemSelectionModel

anonymous
()
Ответ на: комментарий от minakov

вот только не надо человека всякому трешаку учить, он ведь маленький еще, может и повестись

anonymous
()
Ответ на: комментарий от tnodir

Попытка №2: QTreeView и Drag and Drop: как узнать, над какой веткой произошел Drop? (комментарий)

Читаем:

Просто переопредели в модели:

    virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action,
                              int row, int column, const QModelIndex &parent);
    virtual QMimeData *mimeData(const QModelIndexList &indexes) const;
    virtual QStringList mimeTypes() const;
    virtual Qt::DropActions supportedDropActions() const;

Вопрос: за счет чего здесь будет работать подветка элемента, над которым проносят курсор?

Xintrea ★★★★★
() автор топика

А почему этот элемент у тебя не подсвечивается сам собой-то? Это же стандартное поведение.

unC0Rr ★★★★★
()
Ответ на: комментарий от anonymous

вот только не надо человека всякому трешаку учить

Что так сразу-то, вполне нормальное решение

no-such-file ★★★★★
()
Ответ на: комментарий от minakov

Попробовал для проверки просто применить стиль:

QString style="QTreeView::item:hover 
{ 
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, 
stop: 0 #e7effd, 
stop: 1 #cbdaf1); 
border: 1px solid #bfcde4; 
}";

this->setStyleSheet(style);

В результате, при простом перемещении мышкой над элементом, элемент подсвечивается.

При перемещии мышкой в режиме Drag And Drop элемент не подсвечивается (только «вспыхивает» в момент отпускания, чего недостаточно).

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от minakov

Если внимательно посмотреть на код, то можно обнаружить, что решение я как раз и брал с этой страницы. У него есть маленький недостаток: оно не работает при драганддропе.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

А фиг его знает - судя по запросам в гугл, этот вопрос задают довольно часто, а ответом чаще всего - курите документацию по QTreeWiev

minakov ★★★★★
()
Ответ на: комментарий от Xintrea

Вопрос: за счет чего здесь будет работать подветка элемента, над которым проносят курсор?

Если правильно реализуешь эти виртуальные методы для Drag&Drop-а в модели для QTreeView, то всё будет правильно работать: и подсветка элемента, и определение родителя при drop-е и т.п.

tnodir
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.