zoukankan      html  css  js  c++  java
  • Qt QGraphicsScene中限制图元的拖动范围

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

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

     1 QVariant Component::itemChange(GraphicsItemChange change, const QVariant &value)
     2 {
     3     if (change == ItemPositionChange && scene()) {
     4         // value is the new position.
     5         QPointF newPos = value.toPointF();
     6         QRectF rect = scene()->sceneRect();
     7         if (!rect.contains(newPos)) {
     8             // Keep the item inside the scene rect.
     9             newPos.setX(qMin(rect.right(), qMax(newPos.x(), rect.left())));
    10             newPos.setY(qMin(rect.bottom(), qMax(newPos.y(), rect.top())));
    11             return newPos;
    12         }
    13     }
    14     return QGraphicsItem::itemChange(change, value);
    15 }

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

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

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

  • 相关阅读:
    vue父子组件通信
    canvas(一)
    js中的this
    git中遇到的问题
    javaScript中各种数据结构的遍历
    git合并多个提交
    vue学习笔记(三)——vuex—store配置
    vue学习笔记(二)——路由配置
    0欧电阻的作用
    STM32L系列单片机内部EEPROM的读写
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13528859.html
Copyright © 2011-2022 走看看