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

限制QGraphicsItem拖动范围

欲使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按照指定路线被拖动。

### 在 QGraphicsScene 中禁用或隐藏选择框的方法 在 Qt 的 `QGraphicsScene` 中,选择框通常由 `QGraphicsView` 的橡皮筋选择机制(rubber band selection)控制。要禁用或隐藏选择框,可以通过调整 `QGraphicsView` 的交互标志来实现。以下是具体方法: 1. **通过设置 `QGraphicsView::setDragMode` 禁用拖动选择** 使用 `QGraphicsView::setDragMode(QGraphicsView::NoDrag)` 可以禁用拖动时的选择框[^5]。 ```cpp pView->setDragMode(QGraphicsView::NoDrag); ``` 2. **通过重写事件过滤器隐藏选择框** 如果需要更精细的控制,可以重写 `QGraphicsView` 的事件处理函数(如 `mousePressEvent` 或 `mouseMoveEvent`),阻止默认的选择行为[^6]。 ```cpp class CustomGraphicsView : public QGraphicsView { protected: void mousePressEvent(QMouseEvent *event) override { if (event->buttons() & Qt::LeftButton) { // 阻止默认的选择框行为 event->accept(); return; } QGraphicsView::mousePressEvent(event); } void mouseMoveEvent(QMouseEvent *event) override { // 阻止拖动时的选择框 event->accept(); return; } }; ``` 3. **通过禁用 `QGraphicsItem` 的可选中属性** 如果希望某些图元项不可被选中,可以调用 `QGraphicsItem::setFlag(QGraphicsItem::ItemIsSelectable, false)`[^7]。 ```cpp QGraphicsTextItem *textItem = pScene->addText("Hello, world!"); textItem->setFlag(QGraphicsItem::ItemIsSelectable, false); ``` 4. **通过调整 `QGraphicsScene` 的交互标志** 虽然 `QGraphicsScene` 本身不直接控制选择框,但可以通过其关联的 `QGraphicsView` 来间接影响选择行为。例如,禁用 `QGraphicsView` 的所有交互功能[^8]。 ```cpp pView->setInteractive(false); ``` 以上方法可以根据具体需求组合使用,以实现完全禁用或隐藏选择框的效果。 ### 示例代码 以下是一个完整的示例,展示如何禁用 `QGraphicsView` 的选择框: ```cpp QGraphicsScene *pScene = new QGraphicsScene(); pScene->addText("Hello, world!"); QGraphicsView *pView = new QGraphicsView(pScene); pView->setDragMode(QGraphicsView::NoDrag); // 禁用拖动选择 pView->setInteractive(false); // 禁用所有交互功能 // 禁用特定图元项的选择 QGraphicsTextItem *textItem = pScene->addText("Non-selectable item"); textItem->setFlag(QGraphicsItem::ItemIsSelectable, false); pView->show(); ```
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值