当鼠标悬停在项目委托中的文本上时,如何更改鼠标图标? 我有这个部分,但我找不到任何改变鼠标指针的例子。
我错过了什么?
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);
}
}
}
答案 0 :(得分:8)
首先,您需要鼠标位置。您可以使用QCursor::pos
静态函数来获取它。
QPoint globalCursorPos = QCursor::pos();
请注意,结果是全局屏幕坐标,因此您必须在窗口小部件坐标中进行翻译。让我们假设您使用该委托的小部件称为myWidget
。要进行翻译,您需要QWidget
mapFromGlobal
功能
QPoint widgetPos = myWidget->mapFromGlobal(globalCursorPos);
最后,您将需要来自QAbstractItemView
的{{3}},它会在视口坐标点返回项目的模型索引。
如果myView
是您正在使用的视图的名称,则当前位置的索引为:
QModelIndex currentIndex = myView->itemAt(widgetPos);
请注意,为了准确起见,您可能需要indexAt
。在这种情况下,为了映射全局坐标,您需要:
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
并在那里实现功能。查看viewport()
了解详情。