Qt鼠标光标重置

use*_*898 3 c++ mouse qt

我有项委托,当鼠标事件结束时,我将其光标更改为Qt :: PointingHandCursor,当它关闭时我将其设置回Qt :: ArrowCursor.它的工作正常.
问题是,除了它超过图标.它总是叠加在Qt :: ArrowCursor上,即使在图标需要本地更改的情况下,例如调整窗口大小或超过本机按钮时.它总是Qt :: ArrowCursor.
当它没有超过图标时,我怎么能强制Cursor正常行动呢?
这是我做的:

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;
    }
Run Code Online (Sandbox Code Playgroud)

ald*_*ldo 6

您需要使用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));
}
Run Code Online (Sandbox Code Playgroud)

{
  QApplication::restoreOverrideCursor();
}
Run Code Online (Sandbox Code Playgroud)