Chr*_*oph 2 qt hover qgraphicsitem
我有一个带有相当小点标记的QGraphicsScene.我想扩大这些标记的面积,使拖动更容易.标记是距离原点+/- 2像素的十字形.我重新实现了
QGraphicsItem::contains(const QPointF & point ) const
{
return QRectF(-10,-10,20,20);
}
Run Code Online (Sandbox Code Playgroud)
和
void hoverEnterEvent(QGraphicsSceneHoverEvent* event)
{
setPen(QPen(Qt::red));
update();
}
Run Code Online (Sandbox Code Playgroud)
但是当光标直接被光标击中时,标记只会变成红色(甚至有点挑剔).如何扩大"悬停区域"?
正如简短评论中所述:通常这些东西是通过边界矩形或形状函数处理的,尝试重载这些东西.看看QGraphicsItem的qt帮助(http://doc.qt.io/qt-4.8/qgraphicsitem.html#shape):
以本地坐标中的QPainterPath形式返回此项的形状.该形状用于许多事情,包括碰撞检测,命中测试和QGraphicsScene :: items()函数.
默认实现调用boundingRect()以返回简单的矩形形状,但子类可以重新实现此函数,以便为非矩形项返回更准确的形状.例如,圆形项目可以选择返回椭圆形状以便更好地进行碰撞检测.例如:
QPainterPath RoundItem :: shape()const {QPainterPath path; path.addEllipse(boundingRect()); 回归路径; 形状的轮廓可以根据绘图时使用的笔的宽度和样式而变化.如果要在项目的形状中包含此轮廓,可以使用QPainterPathStroker从笔划创建形状.
此函数由contains()和collidesWithPath()的默认实现调用.
因此,基本上发生的是所有想要访问与项目相关联的"区域"的函数,调用形状然后执行例如对所得到的painterpath的包含或碰撞检测.因此,如果你有小物品,你应该扩大形状区域.让我们考虑一下你的目标线,而你的形状实现可能如下所示:
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;
}
Run Code Online (Sandbox Code Playgroud)
笔是细分的成员,我用它的宽度来扩大形状区域.但是你也可以采取与物体的实际尺寸有很好关系的其他东西.
| 归档时间: |
|
| 查看次数: |
2406 次 |
| 最近记录: |