我想在图形项目中更改鼠标光标(MyCircle继承自QObject
和QGraphicsItem
)。
如果我的班级继承自QWidget
,我会重新实现enterEvent()
和leaveEvent()
并按如下方式使用它:
MyCircle::MyCircle(QObject *parent)
: QWidget(parent), QGraphicsItem() // But I can't
{
rect = QRect(-100,-100,200,200);
connect(this,SIGNAL(mouseEntered()),this,SLOT(in()));
connect(this,SIGNAL(mouseLeft()),this,SLOT(out()));
}
void MyCircle::in()
{
QApplication::setOverrideCursor(Qt::PointingHandCursor);
}
void MyCircle::out()
{
QApplication::setOverrideCursor(Qt::ArrowCursor);
}
void MyCircle::enterEvent(QEvent *)
{
emit mouseEntered();
}
void MyCircle::leaveEvent(QEvent *)
{
emit mouseLeft();
}
不幸的是,我需要为那个圆圈设置动画(它实际上是一个按钮),所以我需要QObject,是否有一种简单的方法来改变光标?
答案 0 :(得分:1)
QGraphicsItem
已有一种更改光标的方法,因此您无需手动播放悬停事件:
QGraphicsItem::setCursor(const QCursor &cursor)
http://doc.qt.io/qt-5/qgraphicsitem.html#setCursor
PS:你做的QWidget
和QGraphicsItem
的双重继承也是一个坏主意,只能从QGraphicsItem
继承。
答案 1 :(得分:0)
您可以使用hover events。
在你的类构造函数中确保你做...
setAcceptHoverEvents(true);
然后覆盖hoverEnterEvent
和hoverLeaveEvent
。
virtual void hoverEnterEvent (QGraphicsSceneHoverEvent *event) override
{
QGraphicsItem::hoverEnterEvent(event);
QApplication::setOverrideCursor(Qt::PointingHandCursor);
}
virtual void hoverLeaveEvent (QGraphicsSceneHoverEvent *event) override
{
QGraphicsItem::hoverLeaveEvent(event);
QApplication::setOverrideCursor(Qt::ArrowCursor);
}
作为旁注:您是否真的继承了QObject
和 QGraphicsItem
?如果是这样,您可以通过简单地继承QGraphicsObject
来实现相同的目标。
修改1:回答......
我的指针总指针在我的整个边界中,我怎么能 仅将区域缩小到我的绘图(在这种情况下为圆圈)?
覆盖QGraphicsItem::shape
以返回代表实际形状的QPainterPath
...
virtual QPainterPath shape () const override
{
QPainterPath path;
/*
* Update path to represent the area in which you want
* the mouse pointer to change. This will probably be
* based on the code in your 'paint' method.
*/
return(path);
}
现在覆盖QGraphicsItem::hoverMoveEvent
以使用shape
方法...
virtual void hoverMoveEvent (QGraphicsSceneHoverEvent *event) override
{
QGraphicsItem::hoverMoveEvent(event);
if (shape().contains(event->pos())) {
QApplication::setOverrideCursor(Qt::PointingHandCursor);
} else {
QApplication::setOverrideCursor(Qt::ArrowCursor);
}
}
显然,上述情况可能会影响性能,具体取决于所绘制形状的复杂程度,因此QPainterPath
。
(注意:您可以使用QGraphicsItem::opaque
代替QGraphicsItem::shape
,而不是使用{{1}}。