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

  • 相关阅读:
    由保存当前用户引发的springboot的测试方式postman/restlet还是swagger2
    VS集成opencv编译C++项目遇到的问题
    利用StringUtils可以避免空指针问题
    springboot集成Guava缓存
    Oracle 课程四之索引
    Oracle 课程三之表设计
    Oracle 课程二之Oracle数据库逻辑结构
    Oracle 课程一之Oracle体系结构
    Oracle权限一览表
    Informatica元数据库解析
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13528859.html
Copyright © 2011-2022 走看看