Как изменить указатель мыши при наведении указателя мыши на текст с помощью QStyledItemDelegate? - PullRequest
1 голос
/ 03 февраля 2012

Как изменить значок мыши, когда указатель мыши находится над текстом в делегате элемента?У меня есть эта часть, но я не могу найти пример для изменения указателя мыши.

Что мне не хватает?

   void ListItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                             const QModelIndex &index) const
    {
     if (index.isValid())
        {
      int j = index.column();
      if(j==4)
      {
       QString headerText_DisplayRole = index.data(Qt::DisplayRole).toString() ;
       QApplication::style()->drawPrimitive( QStyle::PE_PanelItemViewItem, &option, painter );

       QFont font = QApplication::font();
       QRect headerRect = option.rect;
       font.setBold(true);
       font.setUnderline(true);
       painter->setFont(font);
       painter->setPen(QPen(option.palette.brush(QPalette::Text), 0));
       const bool isSelected = option.state & QStyle::State_Selected;    
       if (isSelected)
        painter->setPen(QPen(option.palette.brush(QPalette::HighlightedText), 0));
       else
        painter->setPen(QPen(option.palette.brush(QPalette::Text), 0));
       painter->save();    
       painter->drawText(headerRect,headerText_DisplayRole);
       painter->restore();
       bool hover = false;
       if ( option.state & QStyle::State_MouseOver )
       {
           hover = true;
       }
       if(hover)
       {
        // THIS part i missing , how detect when mouse is over the text
        // and if its over how to change the icon of the mouse?
       }


      }
      else
      {
       QStyledItemDelegate::paint(painter, option, index);
      }
     }
    }

1 Ответ

8 голосов
/ 03 февраля 2012

Прежде всего вам понадобится положение мыши.Вы можете получить его, используя статическую функцию 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 и реализовать там функциональность.Проверьте этот блог для более подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...