gpt4 book ai didi

c++ - 使用 QStyledItemDelegate 将鼠标悬停在文本上时如何更改鼠标指针?

转载 作者:太空宇宙 更新时间:2023-11-03 10:33:36 25 4
gpt4 key购买 nike

当鼠标悬停在项目委托(delegate)中的文本上时,如何更改鼠标图标?我有这部分,但我找不到任何更改鼠标指针的示例。

我错过了什么?

   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);
}
}
}

最佳答案

首先,您需要鼠标位置。您可以使用 QCursor::pos 获取它静态函数。

QPoint globalCursorPos = QCursor::pos();

请注意,结果是在全局屏幕坐标中,因此您必须将其转换为小部件坐标。假设您在其上使用委托(delegate)的小部件称为 myWidget。为了进行翻译,您需要 mapFromGlobal QWidget

函数
QPoint widgetPos = myWidget->mapFromGlobal(globalCursorPos);

最后您将需要 indexAt来自 QAbstractItemView,它返回项目在视口(viewport)坐标点的模型索引。

如果 myView 是您正在使用的 View 的名称,那么当前位置的索引是:

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 并在那里实现功能。检查this blog post了解更多详情。

关于c++ - 使用 QStyledItemDelegate 将鼠标悬停在文本上时如何更改鼠标指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9131727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com