• 13526阅读
  • 14回复

如何控制子QGraphicsItem的移动范围? [复制链接]

上一主题 下一主题
离线tianykun
 
只看楼主 倒序阅读 楼主  发表于: 2009-05-05
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
我用一个QGraphicsItem作为父节点,在其上面增加几个QGraphicsItem作为子节点
请问如何控制子节点的移动范围,我想要的是控制子节点在父节点范围内
如:
父QGraphicsItem,范围:


QRectF FrameElement::boundingRect() const
{
return QRectF(0, 0, width, height);
}

那么子节点移动的范围就不能超过width,height

希望各位多多指教。谢谢。
离线sbtree
只看该作者 1楼 发表于: 2009-05-05
重写父节点鼠标移动事件函数,如果当前鼠标的位移导致其拖动的item位置超出范围就进行调整
windows 7 + VC++2008 + Qt4.5.2
离线tianykun
只看该作者 2楼 发表于: 2009-05-05
void mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
}
楼上的,可否说清楚一点,或者有点代码提示?
谢谢
离线tianykun
只看该作者 3楼 发表于: 2009-05-05
可能应该在mouseReleaseEvent事件处理更好
当在放开鼠标的时候,判断是否超过item的范围,
超过则重新设置位置
但是,我暂时还没想到解决的方案
大家可以继续给意见。。。谢谢
离线tianykun
只看该作者 4楼 发表于: 2009-05-05
引用第1楼sbtree于2009-05-05 17:12发表的  :
重写父节点鼠标移动事件函数,如果当前鼠标的位移导致其拖动的item位置超出范围就进行调整


是父节点的鼠标移动事件函数???
还是子节点???
主要判断的是子节点不能超过父节点的范围啊。。
两个都是QGraphicsItem
离线sbtree
只看该作者 5楼 发表于: 2009-05-05
下面的代码没有测试过,基本思想是这样的,我就是这样实现的
  1. void mouseMoveEvent(QGraphicsSceneMouseEvent *event)
  2. {
  3. if(scene() == 0)
  4.     return QGraphicsItem:: mouseMoveEvent(event);
  5. QGraphicsItem *grabber_item = scene()->mouseGrabberItem(); //更正
  6. if (grabber_item == 0 || grabber_item == this )
  7.     return QGraphicsItem:: mouseMoveEvent(event);
  8. QRectF parentRect = boundingRect(), itemRect = grabber_item->boundingRect();
  9. if(!parentRect.contains(itemRect) )
  10. {
  11.     qreal dx = 0, dy = 0;
  12.     if(itemRect .left() < parentRect  .left())
  13.         dx = itemRect .left() - parentRect  .left();
  14.     else if(itemRect .left() > parentRect .right() - itemRect .width())
  15.         dx = itemRect .left() - (parentRect .right() - itemRect .width());
  16.     if(itemRect .top() < parentRect .top())
  17.         dy = itemRect .top() - parentRect .top();
  18.     else if(itemRect .top() > parentRect .bottom() - itemRect .height())
  19.         dy = itemRect .top() - (parentRect .bottom() - itemRect .height());
  20.     grabber_item->setPos(grabber_item.pos() - QPointF(dx,dy)); //更正
  21. }
  22. }
[ 此帖被sbtree在2009-05-06 15:58重新编辑 ]
windows 7 + VC++2008 + Qt4.5.2
离线tianykun
只看该作者 6楼 发表于: 2009-05-06
我在测试的时候,发现如果只是将mouseMove的事件写在父节点上,那么父节点不可以移动,并且效果也达不到。不知道什么原因?
QGraphicsItem *grabber_item = scene()->grabberItem();
这句是不成立的?我只找到:mouseGrabberItem(),不知道楼上的,是否这个意思???
另外:
grabber_item->setPos(grabber_item - QPointF(dx,dy));
这句,setPos()里面的类型不统一。也编译不过。。。

最后想问的是:
这个事件,是写在父节点上,还是要移动的子节点上???
是否只写这个移动的事件就可以??还要写mousePress,mouseRelease???

[ 此帖被tianykun在2009-05-06 11:09重新编辑 ]
离线tianykun
只看该作者 7楼 发表于: 2009-05-06
再次顶起来,希望大家一起讨论
离线sbtree
只看该作者 8楼 发表于: 2009-05-06
不好意思,代码中的两处错误疏忽了,因为是凭着记忆直接在回帖里面写的,没有调试。刚刚更改了,希望不再有错
windows 7 + VC++2008 + Qt4.5.2
离线tianykun
只看该作者 9楼 发表于: 2009-05-06
这个事件函数,是写在父节点上,还是要移动的子节点上???

另外代码中:
grabber_item->setPos(grabber_item.pos() - QPointF(dx,dy)); //更正

改成:
grabber_item->setPos(grabber_item->pos() - QPointF(dx,dy)); //指针符号


我写在子节点上,发现效果就是:子节点,一直往下移动,并且不能上移
其中,父节点范围由这个获得:

QRectF parentRect = this->parentItem()->boundingRect();
其他都跟楼上一样。

但并没达到限制子节点移动的范围啊???
子节点是一直向右下角移动的
[ 此帖被tianykun在2009-05-06 17:37重新编辑 ]
离线sbtree
只看该作者 10楼 发表于: 2009-05-06
在父节点上,如果在子节点上,因为坐标系的问题,肯能要做些修改
windows 7 + VC++2008 + Qt4.5.2
离线tianykun
只看该作者 11楼 发表于: 2009-05-06
但是我要拖动的是子节点,为什么要是父节点操作呢????

QGraphicsItem *grabber_item = scene()->mouseGrabberItem(); //更正
if (grabber_item == 0 || grabber_item == this )
    return QGraphicsItem:: mouseMoveEvent(event);

如果在父节点上的mouseMove事件,那些上面的代码就直接退出了。
因为要拖动,判断的是子节点


坐标系问题?请问是maptoscene(),或者maptoparent(),这些怎么搞??


PS:

如果在子节点上,请问该如何修改??
我用你的方法,结果效果都是子节点往下移动??
[ 此帖被tianykun在2009-05-07 11:00重新编辑 ]
离线tianykun
只看该作者 12楼 发表于: 2009-05-07
顶起来,大家讨论
离线tianykun
只看该作者 13楼 发表于: 2009-05-08
还没搞定,继续顶起来
离线hi2580

只看该作者 14楼 发表于: 2012-06-28
问题解决了吗?刚做了相关功能,希望对你有用.
重新实现itemChange,判断ItemPositionChange标志,
得到父节点范围parentItem->boundingRect,将返回值设置为myPoint。
注意是相对坐标,myPoint.x == 0表示父节点的左边界
快速回复
限100 字节
 
上一个 下一个