我想改变我的鼠标光标的时候它是在一个图形项(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的,有一个简单的方法来改变光标?
你也许可以使用悬停事件 。
在类的构造函数确保你做...
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:在回答...
我在我的整个边界矩形的指点手ICONE,我如何能减少区域只对我的画(在这种情况下,一个圆圈)?
重写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::shape
,你可以做类似的事情QGraphicsItem::opaque
来代替。)
QGraphicsItem
已经为改变光标的方法,所以你不需要手动玩弄悬停事件:
QGraphicsItem::setCursor(const QCursor &cursor)
http://doc.qt.io/qt-5/qgraphicsitem.html#setCursor
PS:的双重遗产QWidget
和QGraphicsItem
你做的也是一个坏主意,只从继承QGraphicsItem
。