我有项委托,当鼠标事件结束时,我将其光标更改为Qt :: PointingHandCursor
当它关闭时我将它设置回Qt :: ArrowCursor。工作正常。
问题是,除了它超过图标。它总是叠加在Qt :: ArrowCursor上
即使在图标需要本地更改的情况下,例如在调整窗口大小或超过本机按钮时。它始终是Qt :: ArrowCursor
如果Cursor没有超过图标,我怎么能强制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;
}
答案 0 :(得分: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()
。通过这种方式,您可以在函数中设置光标形状,并确保在函数结束时自动取消此更改。这可能不适用于所有情况,但是当它发生时,它会让事情变得简单。