我有一个带有相当小点标记的QGraphicsScene。我想扩大这些标记的面积,使拖动更容易。标记是距离原点+/- 2像素的十字形。我重新实现了
QGraphicsItem::contains(const QPointF & point ) const
{
return QRectF(-10,-10,20,20);
}
和
void hoverEnterEvent(QGraphicsSceneHoverEvent* event)
{
setPen(QPen(Qt::red));
update();
}
但是当光标直接被光标击中时,标记只会变为红色(即使这有点挑剔)。如何扩大“悬停区域”?
答案 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;
}
笔是细分的成员,我用它的宽度来扩大形状区域。但是你也可以采取与你对象的实际尺寸有很好关系的其他东西。