显示在qgraphicsview上的地图 移动问题

wyjblue 2014-07-30 03:04:39
绘制步骤:继承qgraphicsitem 绘制item ,scene.additme() view显示 在scene 中的鼠标移动事件中设置了
void Drawmap::mouseMoveEvent( QGraphicsSceneMouseEvent *event )
{
event->accept();
if (mymovestate)
{
QGraphicsItemGroup *group = this->createItemGroup(this->selectedItems());
group->setFlags(QGraphicsItem::ItemIsMovable);
}
}

没效果 求各路神人帮忙,怎么实现移动
...全文
1150 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
clock259 2014-09-30
  • 打赏
  • 举报
回复
噢,最开始我以为你是要实现漫游功能,原来你是要实现 批量 移动图形。我最近做的是个svg编辑器,十月份也会扩展 多个图形 选中后 同时 进行 平移旋转和缩放,我的思路是这样子的:选中后,针对操作需求 同时 对选中的这些图形 做一个矩阵变换,也就是遍历setTransform来设置多个图形新的坐标变换,当然 矩阵变换 前后 的新旧坐标系之间的 坐标 映射 需要处理好。同时拖动多个图形(mousemove)过程中,可以将这几个图形的 几何形状 通过path 叠加在一起传给 QgraphicsView 来绘制 临时控制点,而在mouseRelease 时,才对这几个图形 进行 setTransform,这样不会卡,效率也保证了。
wyjblue 2014-09-30
  • 打赏
  • 举报
回复
引用 21 楼 clock259 的回复:
噢,最开始我以为你是要实现漫游功能,原来你是要实现 批量 移动图形。我最近做的是个svg编辑器,十月份也会扩展 多个图形 选中后 同时 进行 平移旋转和缩放,我的思路是这样子的:选中后,针对操作需求 同时 对选中的这些图形 做一个矩阵变换,也就是遍历setTransform来设置多个图形新的坐标变换,当然 矩阵变换 前后 的新旧坐标系之间的 坐标 映射 需要处理好。同时拖动多个图形(mousemove)过程中,可以将这几个图形的 几何形状 通过path 叠加在一起传给 QgraphicsView 来绘制 临时控制点,而在mouseRelease 时,才对这几个图形 进行 setTransform,这样不会卡,效率也保证了。
这个你用setFlag(QGraphicsItem::ItemIsMovable)就可以实现 demo40000中有你用的;我的需求用这个用它满足不了,继续关注view的translate失效问题
wyjblue 2014-09-27
  • 打赏
  • 举报
回复
View的translate有个副作用,就是view的自动对齐;因此在view中平移用translate是没效果的; view中修改滚动条来平移 这个满足不了需求,那个大牛 还有好的解决方案 可以一起探讨下这个问题
wyjblue 2014-09-23
  • 打赏
  • 举报
回复
刚接触绘制2D地图的时候,就用这个试过了,不行的
xianqingzh 2014-09-23
  • 打赏
  • 举报
回复
关注下 这个问题
clock259 2014-09-14
  • 打赏
  • 举报
回复
我来告诉你:QGraphicsView::setDragMode (QGraphicsView::ScrollHandDrag);一句话搞定,你信吗?
wyjblue 2014-09-05
  • 打赏
  • 举报
回复
路过的大侠,可以继续关注下吗 qgraphicview translation 为什么没效果
wyjblue 2014-08-01
  • 打赏
  • 举报
回复
恩, 移动view 就能看到想看的地方了, 现在问题是我让它移,它不动呀;

void Myview::mousePressEvent( QMouseEvent * event )
{
	if (event->button()==Qt::RightButton)
	{
		
		mPos = mapToScene(event->pos());
		mymovestate=true;
	}
	return QGraphicsView::mousePressEvent(event);
}

void Myview::mouseMoveEvent( QMouseEvent * mevent )
{
	/*this->scene()->selectedItems();*/
	if (mymovestate)
	{
		//this->setDragMode(QGraphicsView::RubberBandDrag);
		QPointF pt = mapToScene ( mevent->pos() );
		QPointF offset = pt - mPos;
		QPoint viewCenter (this->viewport()->width()/2, this->viewport()->height()/2);
		QPointF sceneCenter = mapToScene(viewCenter);
		 target = sceneCenter - offset;
		//this->centerOn(target);
		
		
	}
	return QGraphicsView::mouseMoveEvent(mevent);
}

void Myview::mouseReleaseEvent( QMouseEvent *event )
{
	mymovestate=false;
	this->translate(target.x()*100000,target.y()*100000); //MinPos: -4780 -27000 MaxPos: 19560 24680  
	this->update();
	return QGraphicsView::mouseReleaseEvent(event);
}
引用 11 楼 dbzhang800 的回复:
[quote=引用 10 楼 wyjblue 的回复:] [quote=引用 9 楼 dbzhang800 的回复:] [quote=引用 8 楼 wyjblue 的回复:] [quote=引用 7 楼 dbzhang800 的回复:] 不会用,那就趁这个机会好好学吧,Qt的自带文档多看看,多试试,问题就解决了。 平移的话,centerOn 应该不是好办法,不是有现成的translate()么
QGraphicsView::translate 验证过 没什么效果;按照正常思路是平移坐标系就可以了; 可取滚动条的平移还是没能实现,这个问题纠结了我很长一段时间了,各路大神 不要沉 代码 思路 赐教哈 谢谢[/quote] 多看看Manual多试试吧,这种平移不应该有什么难度的。[/quote] 恩 ,大佬 我刚测试了下 translate 在绘制函数这个 里面是有效的 void MyItem::paint(QPainter *painter,const QStyleOptionGraphicsItem *option,QWidget *widget) { painter.translate(-1000,-1000); draw my map } 但在myview类中 translate 就没效了 原点我也是用 maptoscene() 映射 还是没效果 求解 是那环节出问题了呢[/quote] 你把问题考虑的太复杂了,从最简单的地方开始考虑即可。 就如同你拿着放大镜(View)看报纸(Scene),需要看不同的地方时,放大镜不用换,报纸也不用重新印刷[/quote]
dbzhang800 2014-08-01
  • 打赏
  • 举报
回复
引用 10 楼 wyjblue 的回复:
[quote=引用 9 楼 dbzhang800 的回复:] [quote=引用 8 楼 wyjblue 的回复:] [quote=引用 7 楼 dbzhang800 的回复:] 不会用,那就趁这个机会好好学吧,Qt的自带文档多看看,多试试,问题就解决了。 平移的话,centerOn 应该不是好办法,不是有现成的translate()么
QGraphicsView::translate 验证过 没什么效果;按照正常思路是平移坐标系就可以了; 可取滚动条的平移还是没能实现,这个问题纠结了我很长一段时间了,各路大神 不要沉 代码 思路 赐教哈 谢谢[/quote] 多看看Manual多试试吧,这种平移不应该有什么难度的。[/quote] 恩 ,大佬 我刚测试了下 translate 在绘制函数这个 里面是有效的 void MyItem::paint(QPainter *painter,const QStyleOptionGraphicsItem *option,QWidget *widget) { painter.translate(-1000,-1000); draw my map } 但在myview类中 translate 就没效了 原点我也是用 maptoscene() 映射 还是没效果 求解 是那环节出问题了呢[/quote] 你把问题考虑的太复杂了,从最简单的地方开始考虑即可。 就如同你拿着放大镜(View)看报纸(Scene),需要看不同的地方时,放大镜不用换,报纸也不用重新印刷
wyjblue 2014-08-01
  • 打赏
  • 举报
回复
引用 9 楼 dbzhang800 的回复:
[quote=引用 8 楼 wyjblue 的回复:] [quote=引用 7 楼 dbzhang800 的回复:] 不会用,那就趁这个机会好好学吧,Qt的自带文档多看看,多试试,问题就解决了。 平移的话,centerOn 应该不是好办法,不是有现成的translate()么
QGraphicsView::translate 验证过 没什么效果;按照正常思路是平移坐标系就可以了; 可取滚动条的平移还是没能实现,这个问题纠结了我很长一段时间了,各路大神 不要沉 代码 思路 赐教哈 谢谢[/quote] 多看看Manual多试试吧,这种平移不应该有什么难度的。[/quote] 恩 ,大佬 我刚测试了下 translate 在绘制函数这个 里面是有效的 void MyItem::paint(QPainter *painter,const QStyleOptionGraphicsItem *option,QWidget *widget) { painter.translate(-1000,-1000); draw my map } 但在myview类中 translate 就没效了 原点我也是用 maptoscene() 映射 还是没效果 求解 是那环节出问题了呢
dbzhang800 2014-08-01
  • 打赏
  • 举报
回复
引用 8 楼 wyjblue 的回复:
[quote=引用 7 楼 dbzhang800 的回复:] 不会用,那就趁这个机会好好学吧,Qt的自带文档多看看,多试试,问题就解决了。 平移的话,centerOn 应该不是好办法,不是有现成的translate()么
QGraphicsView::translate 验证过 没什么效果;按照正常思路是平移坐标系就可以了; 可取滚动条的平移还是没能实现,这个问题纠结了我很长一段时间了,各路大神 不要沉 代码 思路 赐教哈 谢谢[/quote] 多看看Manual多试试吧,这种平移不应该有什么难度的。
wyjblue 2014-08-01
  • 打赏
  • 举报
回复
引用 7 楼 dbzhang800 的回复:
不会用,那就趁这个机会好好学吧,Qt的自带文档多看看,多试试,问题就解决了。 平移的话,centerOn 应该不是好办法,不是有现成的translate()么
QGraphicsView::translate 验证过 没什么效果;按照正常思路是平移坐标系就可以了; 可取滚动条的平移还是没能实现,这个问题纠结了我很长一段时间了,各路大神 不要沉 代码 思路 赐教哈 谢谢
wyjblue 2014-08-01
  • 打赏
  • 举报
回复
大侠 问题解决了,在view中translate是没效果的,因为我画的地图用的坐标系是 item 我做了个接口,传移动点 到 myitem里面 然后做translate 这个实现了view 右键移动效果 ,就是不晓得以后会不会出问题 谢谢大侠
引用 12 楼 wyjblue 的回复:
[quote=引用 11 楼 dbzhang800 的回复:] [quote=引用 10 楼 wyjblue 的回复:] [quote=引用 9 楼 dbzhang800 的回复:] [quote=引用 8 楼 wyjblue 的回复:] [quote=引用 7 楼 dbzhang800 的回复:] 不会用,那就趁这个机会好好学吧,Qt的自带文档多看看,多试试,问题就解决了。 平移的话,centerOn 应该不是好办法,不是有现成的translate()么
QGraphicsView::translate 验证过 没什么效果;按照正常思路是平移坐标系就可以了; 可取滚动条的平移还是没能实现,这个问题纠结了我很长一段时间了,各路大神 不要沉 代码 思路 赐教哈 谢谢[/quote] 多看看Manual多试试吧,这种平移不应该有什么难度的。[/quote] 恩 ,大佬 我刚测试了下 translate 在绘制函数这个 里面是有效的 void MyItem::paint(QPainter *painter,const QStyleOptionGraphicsItem *option,QWidget *widget) { painter.translate(-1000,-1000); draw my map } 但在myview类中 translate 就没效了 原点我也是用 maptoscene() 映射 还是没效果 求解 是那环节出问题了呢[/quote] 你把问题考虑的太复杂了,从最简单的地方开始考虑即可。 就如同你拿着放大镜(View)看报纸(Scene),需要看不同的地方时,放大镜不用换,报纸也不用重新印刷[/quote][/quote]
dbzhang800 2014-07-31
  • 打赏
  • 举报
回复
不会用,那就趁这个机会好好学吧,Qt的自带文档多看看,多试试,问题就解决了。 平移的话,centerOn 应该不是好办法,不是有现成的translate()么
wyjblue 2014-07-31
  • 打赏
  • 举报
回复
引用 5 楼 dbzhang800 的回复:
[quote=引用 4 楼 wyjblue 的回复:] 大侠 这个demo我看过了 它里面是在继承 QGraphicsItem类里设置 setFlag(QGraphicsItem::ItemIsMovable, true); setFlag(QGraphicsItem::ItemIsSelectable, true); setflag来移动的 我测试过 少量图元是可以移动 但10万以上的图元 移动的时候就很卡 效率低 求指点
看你的描述, 感觉上,你这些item根本就不需要移动,直接操作 scene 和 view 之间的映射关系应该就够了。(可以通过QGraphicsView的API平移/缩放/旋转,或者操作QTransform进行更多控制)[/quote] 通过centoron设置了,它只有出现滚动条的时候才有效; 我是新手对scene view api不是完全都熟知,楼上的能具体的说下嘛
void Myview::mouseMoveEvent( QMouseEvent * mevent )
{
	/*this->scene()->selectedItems();*/
	if (mymovestate)
	{
		//this->setDragMode(QGraphicsView::RubberBandDrag);
		QPointF pt = mapToScene ( mevent->pos() );
		QPointF offset = pt - mPos;
		QPoint viewCenter (this->viewport()->width()/2, this->viewport()->height()/2);
		QPointF sceneCenter = mapToScene(viewCenter);
		QPointF target = sceneCenter - offset;
		this->centerOn(target);
		
	}
	return QGraphicsView::mouseMoveEvent(mevent);
}
dbzhang800 2014-07-31
  • 打赏
  • 举报
回复
引用 4 楼 wyjblue 的回复:
大侠 这个demo我看过了 它里面是在继承 QGraphicsItem类里设置 setFlag(QGraphicsItem::ItemIsMovable, true); setFlag(QGraphicsItem::ItemIsSelectable, true); setflag来移动的 我测试过 少量图元是可以移动 但10万以上的图元 移动的时候就很卡 效率低 求指点
看你的描述, 感觉上,你这些item根本就不需要移动,直接操作 scene 和 view 之间的映射关系应该就够了。(可以通过QGraphicsView的API平移/缩放/旋转,或者操作QTransform进行更多控制)
wyjblue 2014-07-31
  • 打赏
  • 举报
回复
大侠 这个demo我看过了 它里面是在继承 QGraphicsItem类里设置 setFlag(QGraphicsItem::ItemIsMovable, true); setFlag(QGraphicsItem::ItemIsSelectable, true); setflag来移动的 我测试过 少量图元是可以移动 但10万以上的图元 移动的时候就很卡 效率低 求指点
powerwheel 2014-07-31
  • 打赏
  • 举报
回复
Qt源码中的examples/widgets/graphicsview/diagramscene Qt自带的例子看看去吧
wyjblue 2014-07-31
  • 打赏
  • 举报
回复
大神 求具体思路 ,有大量的item 需要通过鼠标来整体移动 类似google map ,view支持dragmode 试了几次这个只有出现滚动条的时候才有效, 做的效果 是不出现滚动条 就可以 灵活的通过鼠标移动由大量item组成的map 我是菜鸟找不到决绝方案 求大神 关注
powerwheel 2014-07-31
  • 打赏
  • 举报
回复
设置了ItemIsMovable标志只是说明让该item是可移动的,你不会想着让它自己跟着你鼠标移动吧,移动的代码还是需要自己写的吧

16,215

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧