Qt鼠标光标重置

Qt Mouse Cursor reset

本文关键字:光标 鼠标 Qt      更新时间:2023-10-16

我有一个项目委托,当鼠标事件在图标上时,我将其Cursor更改为Qt::PointingHandCursor当它关闭时,我将其设置回Qt::ArrowCursor。它运行良好
问题是,当它越过图标时。它一直堆叠在Qt::ArrowCursor上即使在图标需要本地更改的情况下,如调整窗口大小或使用本地按钮时。它总是Qt::ArrowCursor
当光标不在图标上时,我如何强制光标正常工作
我是这样做的:

bool MiniItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model,
                                         const QStyleOptionViewItem &option,
                                         const QModelIndex &index)
    {
        // Emit a signal when the icon is clicked
        QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
        if(!index.parent().isValid() &&
                event->type() == QEvent::MouseMove) 
        {
             QSize  iconsize = m_iconAdd.actualSize(option.decorationSize); 
             QRect closeButtonRect =  m_iconAdd.pixmap(iconsize.width(),iconsize.height()).
                                                        rect().translated(AddIconPos(option));
             QSize iconRemoveSize = m_iconRemove.actualSize(option.decorationSize);
             QRect iconRemoveRect =  m_iconRemove.pixmap(iconRemoveSize.width(),iconRemoveSize.height()).
                                                                rect().translated(RemoveIconPos(option));
             if(closeButtonRect.contains(mouseEvent->pos()))
             {                
                QApplication::setOverrideCursor(QCursor(Qt::PointingHandCursor)); 
             }
             else if(iconRemoveRect.contains(mouseEvent->pos()))
             {
                QApplication::setOverrideCursor(QCursor(Qt::PointingHandCursor)); 
             }
             else
             {
                 Qt::CursorShape shape = Qt::ArrowCursor;
                 QApplication::setOverrideCursor(QCursor(shape)); 
             }
        }
        if(!index.parent().isValid() &&
                event->type() == QEvent::MouseButtonRelease) 
        {

             QSize  iconsize = m_iconAdd.actualSize(option.decorationSize); 
             QRect closeButtonRect =  m_iconAdd.pixmap(iconsize.width(),iconsize.height()).
                                                        rect().translated(AddIconPos(option));
             QSize iconRemoveSize = m_iconRemove.actualSize(option.decorationSize);
             QRect iconRemoveRect =  m_iconRemove.pixmap(iconRemoveSize.width(),iconRemoveSize.height()).
                                                                rect().translated(RemoveIconPos(option));
             if(closeButtonRect.contains(mouseEvent->pos()))
             {
               ; 
             }
             else if(iconRemoveRect.contains(mouseEvent->pos()))
             {
                ; 
             }
        }
        return false;
    }

您需要使用restoreOverrideCursor()来撤消对setOverrideCursor()的每次调用。来自文件:

http://doc.qt.io/archives/qt-4.7/qapplication.html#setOverrideCursor

应用程序游标存储在内部堆栈中。setOverrideCursor()将光标推到堆栈上restoreOverrideCursor()将活动光标从堆栈中弹出。changeOverrideCursor()更改当前活动的应用程序覆盖光标。最终必须遵循每个setOverrideCursor()通过相应的restoreOverrideCursor(),否则堆栈将永远不要清空。

你必须弄清楚如何在你的代码中实现这一点(还不清楚你想要什么行为),但你可以从替换else子句开始

{
  Qt::CursorShape shape = Qt::ArrowCursor;
  QApplication::setOverrideCursor(QCursor(shape));
}

带有

{
  QApplication::restoreOverrideCursor();
}

注意:在我的应用程序中,我创建了一个RAII风格的类,该类用Qt::CursorShape初始化,在其构造函数中调用setOverrideCursor(...),在其析构函数中调用restoreOverrideCursor()。通过这种方式,您可以在函数中设置光标形状,并确保在函数结束时自动取消此更改。这可能不适用于所有情况,但当它适用时,它会让事情变得简单。