我正在尝试为表视图实现自己的QAbstractItemDelegate。 我添加了鼠标悬停效果,但是,我有两个问题:
1。我的鼠标悬停检测有问题 2. Item委托需要额外的重绘,我不知道如何触发重绘。
我尝试使用paint
中的以下代码检测鼠标何时悬停在我的代理上:
void myClass::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const {
if (painter->window().contains(option.widget->mapFromGlobal(QCursor::pos()))) {
// ...
}
}
这导致矩形在实际列之后的列中的其他单元格上延伸,并检测鼠标是否也在这些列上。我也试过了options.rect
,但是这个矩形似乎移到了我的实际细胞之上。
出于某种原因,当光标进入窗口小部件时窗口小部件会自动重新绘制,但鼠标离开时则不会。这会导致窗口小部件陷入悬停状态,除非我通过在该区域上滑动另一个窗口来强制重绘。
虽然我可以通过以下代码检测鼠标何时进入/离开我的小部件,但我不知道如何触发我的小部件的重绘。由于我没有从QWidget
继承,因此我没有update()
可用,而且我不知道如何获取QPainter
来调用paint
。如何触发重新绘制?
bool myClass::editorEvent(QEvent* event, QAbstractItemModel* model, const QStyleOptionViewItem& option, const QModelIndex& index) {
switch(event->type()) {
case QEvent::Enter:
case QEvent::HoverEnter:
std::cout << "+" << index.row() << std::endl;
break;
case QEvent::Leave:
case QEvent::HoverLeave:
std::cout << "+" << index.row() << std::endl;
//paint(, option, index);
break;
}
return false;
}
答案 0 :(得分:3)
检查鼠标是否可以这样:
bool hover = option.state & QStyle::State_MouseOver
重新绘制不是项目委托任务,而是视图。因此,您应该在视图中检测鼠标离开事件并在那里调用update()
。它将触发重新绘制视图的代理。