在QGraphicsScene中限制图元的拖动范围

欲使QGraphicsItem可拖动,则需设置标志位:setFlag(ItemIsMovable,true);

而如果想限制QGraphicsItem对象的移动范围,需要继承QGraphicsItem类,重载itemChange()虚函数,关于该函数的重载,QT文档中示例如下:

QVariant Component::itemChange(GraphicsItemChange change, const QVariant &value)
{
    if (change == ItemPositionChange && scene()) {
        // value is the new position.
        QPointF newPos = value.toPointF();
        QRectF rect = scene()->sceneRect();
        if (!rect.contains(newPos)) {
            // Keep the item inside the scene rect.
            newPos.setX(qMin(rect.right(), qMax(newPos.x(), rect.left())));
            newPos.setY(qMin(rect.bottom(), qMax(newPos.y(), rect.top())));
            return newPos;
        }
    }
    return QGraphicsItem::itemChange(change, value);
}

ItemPositionChange 用于通知所属QGraphicsItem的位置即将发生变化,而value的值即为QGraphicsItem将来的位置坐标,以上代码把item将来的位置坐标value与scene rect 的上下左右边界进行比较,根据比较结果更改value,使其取值在scene rect 范围内, 进而达到了限制item拖动范围的目的。

但上述代码只有在QGraphicsScene的大小已经被事先设定好了才好用,如果预先未设置QGraphicsScene大小,那么scene的大小将随着item的添加不断增大,这种范围的限制就没什么意义了。

如果我们即想将scene设为自动无限增大的,又想限制item在某方向的拖动,只要找到限制拖动的那条基准线的横坐标或者纵坐标,按照与上述代码中同样的原理,就可轻松限制item的拖动,甚至可以使item按照指定路线被拖动。

参考资源链接:[Qt6.4实现仿Visio流程图开发教程](https://wenku.youkuaiyun.com/doc/461bdxagvy?utm_source=wenku_answer2doc_content) 在Qt中实现一个流程图组件涉及到多个关键步骤,包括理解场景管理、视图展示以及图元的自定义绘制和交互。为了更好地掌握这些概念,建议您参考《Qt6.4实现仿Visio流程图开发教程》。这份教程详细介绍了如何使用Qt框架中的QGraphicsScene和QGraphicsView类来构建一个流程图应用。 首先,创建自定义图元需要继承QGraphicsItem类。在自定义的图元类中,您可以重写paint()方法来自定义图元的绘制方式,并重写mousePressEvent()和mouseMoveEvent()方法来实现图元拖动功能。例如: ```cpp class MyItem : public QGraphicsItem { public: MyItem(QGraphicsItem *parent = nullptr) : QGraphicsItem(parent) {} protected: void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override { // 自定义绘制图逻辑 } void mousePressEvent(QGraphicsSceneMouseEvent *event) override { // 处理鼠标按下事件,以便拖动图元 } void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override { // 处理鼠标移动事件,实时更新图元位置 } }; ``` 接下来,实现图元之间的连线编辑,您需要对图元的坐标位置进行精确的计算。这通常在图元对象的mousePressEvent和mouseMoveEvent中实现,记录图元的连接点,并在mouseReleaseEvent中绘制连线。Qt提供了一个便利的方法QGraphicsScene::addLine()用于绘制线条,您可以在图形场景中添加连线。 为了实现磁吸线功能,您需要在处理鼠标移动事件时,检测其他图元的连接点,并计算鼠标点与最近的连接点之间的距离。如果距离小于某个阈值,就自动吸附到该连接点。 图元类型的扩展性可以通过简单地添加新的继承自QGraphicsItem的类来实现,并在场景中注册这些新图元,使其成为可选的图元类型。 通过这些步骤,您可以在Qt中创建一个基本的流程图组件,并且允许用户拖动图元、连接图元,并实现磁吸线功能。如果您希望进一步深入学习如何设计复杂的用户界面和图形处理,建议继续阅读《Qt6.4实现仿Visio流程图开发教程》中的高级主题和项目实战部分。 参考资源链接:[Qt6.4实现仿Visio流程图开发教程](https://wenku.youkuaiyun.com/doc/461bdxagvy?utm_source=wenku_answer2doc_content)
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值