如何放大QGraphicsItem的悬停区域

时间:2012-12-02 12:41:55

标签: qt hover qgraphicsitem

我有一个带有相当小点标记的QGraphicsScene。我想扩大这些标记的面积,使拖动更容易。标记是距离原点+/- 2像素的十字形。我重新实现了

QGraphicsItem::contains(const QPointF & point ) const
{
  return QRectF(-10,-10,20,20);
}

void hoverEnterEvent(QGraphicsSceneHoverEvent* event)
{
  setPen(QPen(Qt::red));
  update();
}

但是当光标直接被光标击中时,标记只会变为红色(即使这有点挑剔)。如何扩大“悬停区域”?

1 个答案:

答案 0 :(得分:5)

如简短评论中所述: 通常这些东西是通过边界矩形或形状函数处理的,尝试重载那些东西。在形状(http://doc.qt.io/qt-4.8/qgraphicsitem.html#shape)下查看QGraphicsItem的qt帮助:

  

以本地坐标中的QPainterPath形式返回此项的形状。   形状用于许多事情,包括碰撞检测,命中   测试,以及QGraphicsScene :: items()函数。

     

默认实现调用boundingRect()返回一个简单的   矩形形状,但子类可以重新实现此功能   为非矩形物品返回更准确的形状。例如,a   圆形项目可以选择返回椭圆形状以获得更好的碰撞   检测。例如:

     

QPainterPath RoundItem :: shape()const {        QPainterPath路径;        path.addEllipse(boundingRect());        回归路径;形状的轮廓可以根据绘图时使用的笔的宽度和样式而变化。如果你想包括   这个轮廓在项目的形状中,你可以从中创建一个形状   使用QPainterPathStroker进行中风。

     

此函数由contains()的默认实现调用   和collidesWithPath()。

所以基本上发生的是所有想要访问与项目相关联的“区域”的函数,调用形状然后执行以下操作:用最终的画家路径进行遏制或碰撞检测。 因此,如果你有小物品,你应该扩大形状区域。 例如,让我们考虑一个作为目标的线,而不是您的形状实现如下所示:

QPainterPath Segment::shape() const{
  QLineF temp(qLineF(scaled(Plotable::cScaleFactor)));
  QPolygonF poly;
  temp.translate(0,pen.widthF()/2.0);
  poly.push_back(temp.p1());
  poly.push_back(temp.p2());
  temp.translate(0,-pen.widthF());
  poly.push_back(temp.p2());
  poly.push_back(temp.p1());
  QPainterPath path;
  path.addPolygon(poly);
  return path;
}

笔是细分的成员,我用它的宽度来扩大形状区域。但是你也可以采取与你对象的实际尺寸有很好关系的其他东西。