首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Qt鼠标光标重置

Qt鼠标光标重置
EN

Stack Overflow用户
提问于 2012-03-26 05:22:23
回答 1查看 4.5K关注 0票数 3

我让项目委托,当鼠标事件超过图标时,我将其光标更改为Qt::PointingHandCursor,当它关闭时,我将其设置回Qt::ArrowCursor。它工作得很好。

问题是,除了当它在图标上时。它总是堆叠在Qt::ArrowCursor上,即使在图标需要本机更改的情况下,比如调整窗口大小或超过本机按钮时也是如此。它总是Qt::ArrowCursor。

当光标不在图标上时,如何强制光标正常运行?

下面是我要做的:

代码语言:javascript
运行
复制
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;
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-26 05:56:36

您需要使用restoreOverrideCursor()来撤消对setOverrideCursor()的每个调用。从文档中:

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

应用程序游标存储在内部堆栈中。setOverrideCursor()将光标推到堆栈上,而restoreOverrideCursor()将活动光标弹出堆栈。changeOverrideCursor()更改当前活动的应用程序覆盖光标。每个setOverrideCursor()最后都必须跟一个对应的restoreOverrideCursor(),否则堆栈永远不会被清空。

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

代码语言:javascript
运行
复制
{
  Qt::CursorShape shape = Qt::ArrowCursor;
  QApplication::setOverrideCursor(QCursor(shape));
}

使用

代码语言:javascript
运行
复制
{
  QApplication::restoreOverrideCursor();
}

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9864199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档