Qt 如何知道使用QStyledItemDelegate绘制的项目的特定部分何时处于悬停状态?
我有一个自定义QAbstractItemModel,用于在QTreeWidget中显示信息。但是,单个索引是使用QStyledItemDelegate绘制的。使用委托绘制的一个项目是pixmap。当用户将鼠标悬停在pixmap上时(帮助事件样式或悬停输入样式都可以),我需要做一些事情,它是什么并不重要 所以我的问题是,当鼠标悬停在QTreeWidget中的某个特定项上时,如何知道该项是使用委托绘制的Qt 如何知道使用QStyledItemDelegate绘制的项目的特定部分何时处于悬停状态?,qt,Qt,我有一个自定义QAbstractItemModel,用于在QTreeWidget中显示信息。但是,单个索引是使用QStyledItemDelegate绘制的。使用委托绘制的一个项目是pixmap。当用户将鼠标悬停在pixmap上时(帮助事件样式或悬停输入样式都可以),我需要做一些事情,它是什么并不重要 所以我的问题是,当鼠标悬停在QTreeWidget中的某个特定项上时,如何知道该项是使用委托绘制的 在其他情况下,我可以将QLabel子类化,在其上设置pixmap,然后在event()函数中执行
在其他情况下,我可以将QLabel子类化,在其上设置pixmap,然后在event()函数中执行我需要的任何操作,但在这种情况下,pixmap后面没有对象,它只是绘制在屏幕上,因此它实际上不接收事件。是否可以使用委托在我希望的位置绘制实际的小部件,以便小部件可以接收事件,或者我必须以其他方式解决此问题?您可以将
QTreeWidget
子类化,并重新实现mouseMoveEvent
。在这种情况下,您可以使用该功能检查鼠标位置是否有有效项,然后执行所需操作
void MyTreeWidget::mouseMoveEvent(QMouseEvent * event)
{
QTreeWidget::mouseMoveEvent(event);
QTreeWidgetItem* treeItem = itemAt(event->pos());
if (treeItem != NULL)
doSomething(treeItem);
}
您可以避免子类化QTreeWidget
,并在父窗口小部件/主窗口中实现它。但是请注意,itemAt
函数需要小部件视口中的坐标,因此您应该将坐标转换为树小部件的坐标。IMHO将其子类化并只实现mousemovevent
函数更为优雅
编辑
如果您需要检测小部件项目中图标的位置,它会更高级一些,但您可以查看我对旧问题的回答以了解更多详细信息:
此问题没有内置的Qt解决方案。但是,可以通过在绘制时保存使用代理绘制的各个项目的几何图形来解决此问题。但是,
paint()
函数有一个const
修饰符,因此用于保存几何图形的数据结构必须是可变的
。在这种情况下,我不认为这违反了OOP的原则,而是说明了mutable
关键字存在的原因以及应该在何时使用它的一个主要例子
然后,您需要将
QTreeWidget
子类化,这样就可以重新实现weblectic所说的mousemovevent()
函数。在该函数中,您可以将鼠标的位置与之前绘制的项目的几何图形进行比较。如果鼠标位于项目内,则鼠标处于悬停状态。问题不在于找到QTreeWidgetItem,而在于知道鼠标是否悬停在我使用QStyledItemDelegate绘制的QTreeWidgetItem内的特定项目上。假设QTreeWidgetItem文本右侧有一个图标。它总是在不同的地方,因为文本的长度不同。或者它完全处于随机位置。