Qt鼠标光标重置
Qt Mouse Cursor reset
我有一个项目委托,当鼠标事件在图标上时,我将其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()
。通过这种方式,您可以在函数中设置光标形状,并确保在函数结束时自动取消此更改。这可能不适用于所有情况,但当它适用时,它会让事情变得简单。
- 在 macOS 中使用 C/C++ 设置鼠标光标图像
- 在 C# 中更改鼠标光标图标
- 将鼠标悬停在图片框上时,如何显示带有 x-y 坐标的十字准线光标?
- 如何获得鼠标光标连接时按下左键单击和在C++中释放左键单击时?
- 由于选项卡顺序的原因,鼠标光标总是得到错误的hwnd-MFC应用程序
- 如何在C++中模拟鼠标光标的移动
- 如何确定鼠标光标所在的控制台字符
- 如何在QML中设置鼠标光标位置
- 确定鼠标光标所在的主机上的字符
- 用鼠标光标移动圆圈
- MFC GUI 自定义控件:如何绘制光标更新以响应鼠标移动?
- 获取有关 X11 中离鼠标光标最近的显示器的信息
- 防止触摸输入移动的鼠标光标在窗口上
- 如何更改鼠标光标的大小?
- 如何在Qwidget上获取当前的鼠标光标位置
- QT4.8嵌入.使用QCursor :: SetPos()调整鼠标输入会导致一个抽搐的光标
- 当我按Enter或在其区域外单击鼠标时,如何从可编辑的Qcombobox中删除光标
- 在 VC++ MFC 中创建另一个鼠标光标
- 当光标锁定在屏幕中时,如何获得鼠标移动
- 如何将光标(鼠标指针对象)转换为bmp图像的自动序列