gpt4 book ai didi

c++ - QAbstractItemDelegate 悬停和(重新)绘制

转载 作者:行者123 更新时间:2023-11-30 02:34:03 25 4
gpt4 key购买 nike

我正在尝试为表格 View 实现我自己的 QAbstractItemDelegate。我添加了鼠标悬停效果,但是,我有两个问题:

1. 我的鼠标悬停检测有问题
2. Item 委托(delegate)需要额外重绘,我不知道如何触发重绘。

鼠标悬停问题

我尝试使用 paint 中的以下代码检测鼠标何时悬停在我的委托(delegate)上:

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 来调用 绘制。如何触发重绘?

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

最佳答案

检查鼠标悬停是否喜欢这样:

bool hover = option.state & QStyle::State_MouseOver

重绘不是项目委托(delegate)任务而是 View 的任务。所以你应该在你的 View 中检测鼠标离开事件并在那里调用 update() 。它将触发重绘 View 的委托(delegate)。

关于c++ - QAbstractItemDelegate 悬停和(重新)绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34884006/

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