Qt鼠标光标重置

3

我有一个项目代理,当鼠标事件悬停在图标上时,我将其光标更改为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;
    }
1个回答

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));
}

使用

{
  QApplication::restoreOverrideCursor();
}

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接