在QObject - QGraphicsItem继承的类中更改鼠标光标

时间:2017-06-19 16:37:30

标签: qt nested

我想在图形项目中更改鼠标光标(MyCircle继承自QObjectQGraphicsItem)。 如果我的班级继承自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,是否有一种简单的方法来改变光标?

2 个答案:

答案 0 :(得分:1)

QGraphicsItem已有一种更改光标的方法,因此您无需手动播放悬停事件:

QGraphicsItem::setCursor(const QCursor &cursor)

http://doc.qt.io/qt-5/qgraphicsitem.html#setCursor

PS:你做的QWidgetQGraphicsItem的双重继承也是一个坏主意,只能从QGraphicsItem继承。

答案 1 :(得分:0)

您可以使用hover events

在你的类构造函数中确保你做...

setAcceptHoverEvents(true);

然后覆盖hoverEnterEventhoverLeaveEvent

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}}。