在一个QObject更改鼠标光标 - 的QGraphicsItem继承的类(Changing mou

2019-09-28 18:25发布

我想改变我的鼠标光标的时候它是在一个图形项(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的,有一个简单的方法来改变光标?

Answer 1:

你也许可以使用悬停事件 。

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

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:在回答...

我在我的整个边界矩形的指点手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来代替。)



Answer 2:

QGraphicsItem已经为改变光标的方法,所以你不需要手动玩弄悬停事件:

QGraphicsItem::setCursor(const QCursor &cursor)

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

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



文章来源: Changing mouse cursor in a QObject - QGraphicsItem inherited class
标签: qt nested