Прежде всего вам понадобится положение мыши.Вы можете получить его, используя статическую функцию QCursor::pos
.
QPoint globalCursorPos = QCursor::pos();
Обратите внимание, что результат находится в глобальных экранных координатах, поэтому вам придется перевести его в координаты виджета.Предположим, что виджет, на котором вы используете делегата, называется myWidget
.Для выполнения перевода вам понадобится mapFromGlobal
функция QWidget
QPoint widgetPos = myWidget->mapFromGlobal(globalCursorPos);
Наконец вам понадобится indexAt
отQAbstractItemView
, который возвращает модельный индекс элемента в точке координат окна просмотра.
Если myView
является названием используемого вами вида, тогда индекс для текущей позиции:
QModelIndex currentIndex = myView->itemAt(widgetPos);
Обратите внимание, что вам может понадобиться viewport()
, чтобы быть точным.В этом случае для отображения глобальных координат вам понадобится:
QPoint viewportPos = myWidget->viewport()->mapFromGlobal(globalCursorPos);
Наконец, вы должны проверить, совпадает ли возвращенный индекс с itemAt
с индексом в вашей функции paint
.Если да, измените курсор на то, что вы хотите, иначе восстановите курсор по умолчанию
if(hover)
{
QPoint globalCursorPos = QCursor::pos();
QPoint viewportPos = myWidget->viewport()->mapFromGlobal(globalCursorPos);
QModelIndex currentIndex = myView->itemAt(widgetPos);
if (currentIndex == index)
QApplication::setOverrideCursor(QCursor(Qt::PointingHandCursor));
else
QApplication::restoreOverrideCursor();
}
Это основная идея.Другой вариант - переопределить mouseMoveEvent
и реализовать там функциональность.Проверьте этот блог для более подробной информации.