首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QAbstractItemDelegate悬停和(Re)涂料

QAbstractItemDelegate悬停和(Re)涂料
EN

Stack Overflow用户
提问于 2016-01-19 18:09:09
回答 1查看 2.1K关注 0票数 2

我正在尝试为表视图实现我自己的QAbstractItemDelegate。我添加了鼠标覆盖效应,但是,我有两个问题:

1.我的鼠标越野车探测到有问题

2.项目委托需要额外的重绘,我不知道如何触发重绘。

滑鼠问题

我尝试用paint中的以下代码检测鼠标在我的委托上徘徊的时间

代码语言:javascript
复制
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(),我也不知道如何获得调用paintQPainter。我如何触发重新油漆?

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-19 18:26:06

检查一下鼠标是否可以像这样:

代码语言:javascript
复制
bool hover = option.state & QStyle::State_MouseOver

重新绘制不是项委托任务,而是视图的任务。因此,您应该在视图中检测鼠标离开事件,并在那里调用update()。它将触发重新绘制视图的委托。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34884006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档