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

标签 c++ qt

我正在尝试为 TableView 实现我自己的 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/

相关文章:

c++ - 捕捉 QTableWidgetItem 检查状态变化

c++ - 如何在结构中使用字符串而不是 char 数组来读取二进制数据

c++ - FindFirstFile 不适用于通配符

c++ - 为什么 boost::diagnostic_information 崩溃了以及如何修复它?

实现文件中的 C++ Getters-Setter

c++ - 图形场景中的 QMouseEvents 不起作用

c++ - 长双字符串

python - QT 翻译和 HTML 子集

c++ - 元组作为函数参数中的默认值

c++ - 将 QString 十六进制转换为 ASCII 值