【问题标题】:ListViewItem stuck in mouse over state when the mouse leaves a QListView当鼠标离开 QListView 时,ListViewItem 卡在鼠标悬停状态
【发布时间】:2018-05-28 17:11:17
【问题描述】:

当鼠标光标离开 QListview 时,我正在尝试从项目中删除鼠标悬停状态。

我在 QStyledItemDelegate 中检查鼠标悬停状态如下:

void MyDelegate::paint( QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const
{
    if( option.state & QStyle::State_MouseOver)
     {
        // Paint in MouseOver state
     }
     else
     {
        // Paint normally
     }
 }

然后我在我的 QListView 中实现了 leaveEvent 来调用更新。

void MyListView::leaveEvent(QEvent *event)
{
   // update();  
   QListView::leaveEvent(event);
   update();   // Same result if update() called before or after QListView::leaveEvent 
}

这确实会调用休假委托的绘制方法,但不会更改 QListView 中最后悬停的项目的悬停状态。

当光标离开列表视图时,有没有办法强制代理重新绘制而不是处于鼠标悬停状态?

我使用的是 Qt 5.6,并且已经在 Centos 7 和 Fedora 27 和 28 上进行了测试。

【问题讨论】:

  • 只是一枪成蓝色:您是否尝试过使用viewport()->update(); 而不是update();?我在继承自QAbstractScrollArea 的其他小部件中也遇到了类似的问题。顺便提一句。我什至在QAbstractItemView 中发现了这一点:注意: 如果您继承 QAbstractItemView 并打算更新视口的内容,则应使用 viewport->update() 而不是 update()因为所有的绘画操作都发生在视口上。
  • 我刚刚尝试过,没有运气。我将尝试将我的 Qt 版本更新到最新版本,看看它是否能解决问题。

标签: c++ qt qt5


【解决方案1】:

这似乎是 QT 5.6 版本中的一个错误。 我将 QT 版本升级到 5.11 并解决了问题。升级后无需实现QListView::leaveEvent。

我还在 QT 5.10 上测试了代码,它在那里运行良好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多