【问题标题】:QAbstractItemDelegate hover and (re)paintQAbstractItemDelegate 悬停和(重新)绘制
【发布时间】:2016-01-19 18:09:09
【问题描述】:

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

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

鼠标悬停问题

我尝试使用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;
}

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    检查鼠标是否可以这样:

    bool hover = option.state & QStyle::State_MouseOver
    

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

    【讨论】:

    • 使用鼠标悬停检测解决了我所有的问题(显然 tablewidget 请求在每个 mouseevent 上重绘)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 2015-07-15
    • 2021-05-29
    • 2013-05-07
    • 2012-11-13
    • 1970-01-01
    相关资源
    最近更新 更多