找回密码
 立即注册
收起左侧

怎么做出类似windows的画图软件

5
回复
5390
查看
[复制链接]
累计签到:10 天
连续签到:1 天
来源: 2015-11-21 22:09:26 显示全部楼层 |阅读模式

马上注册,查看详细内容!注册请先查看:注册须知

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
    我知道一般是重写下面4个函数:
    void paintEvent(QPaintEvent *);   //重绘事件
    void mousePressEvent(QMouseEvent *);  //鼠标按下事件
    void mouseMoveEvent(QMouseEvent *);   //鼠标移动事件
    void mouseReleaseEvent(QMouseEvent *);   //鼠标释放事件
做个简单的画图板我会,现在主要有两个问题不会解决,如下图所示,在windows画图软件里面,画完一个图形,可以
显示出图形的外接矩形,然后有皮筋效果,可以沿着周围的8个点对图形进行拉伸和缩放,当鼠标在图形内部的时候,
还可以拖动图形到任意位置,请问有什么好的办法吗?需要自己计算图形的外接矩形,然后在矩形的顶点和每条边的中点
画一个小矩形吗?然后当鼠标悬停的位置在8个点的时候,改变鼠标形状,单击进行拉伸和缩放,
通过重新计算距离重绘图形吗?拖动是判断鼠标悬停在图形内部,然后单击拖动,不断计算点的坐标然后重绘吗?
如果要实现这两个功能,是不是使用Graphics View比较容易?
请大家帮帮忙,谢谢。想自己做一个画图程序,加深对Qt的理解和运用。








回复

使用道具 举报

累计签到:10 天
连续签到:1 天
2015-11-22 20:17:27 显示全部楼层
找到了一个例子,加上自己的改写,成功实现了放缩和拖动,果然还是Graphics View好用啊!
回复 支持 反对

使用道具 举报

累计签到:1570 天
连续签到:1 天
2015-11-22 20:31:05 显示全部楼层
wwj_ff 发表于 2015-11-22 20:17
找到了一个例子,加上自己的改写,成功实现了放缩和拖动,果然还是Graphics View好用啊! ...

嗯,图形视图编程很强大,不过要实现你想要的功能,还是需要加倍努力啊。
回复 支持 反对

使用道具 举报

累计签到:10 天
连续签到:1 天
2015-11-23 21:32:52 显示全部楼层
yafeilinux 发表于 2015-11-22 20:31
嗯,图形视图编程很强大,不过要实现你想要的功能,还是需要加倍努力啊。 ...

是啊,有点麻烦,自己定义了两个类,分别继承QGraphicsView 和QGraphicsItem,然后重新实现各自的鼠标事件,现在能写的图形形状有一定的约束,我都是通过一个矩形拖动,然后画出其内接的形状,所以就算是三角形,也不能随便画形状,取矩形的顶边的中点和底边的两个角画的。然后判断图形画好以后,去掉其四周的皮筋效果,我是通过鼠标右键表示的,其实左键点了矩形以外,应该也算画好了。现在还有一个问题就是,我在场景里面画的图形坐标和视图里面显示的不一致,有点漂移,请问亚飞;老师,可以怎么方便的变化吗?
回复 支持 反对

使用道具 举报

累计签到:10 天
连续签到:1 天
2015-11-23 23:00:43 显示全部楼层
wwj_ff 发表于 2015-11-23 21:32
是啊,有点麻烦,自己定义了两个类,分别继承QGraphicsView 和QGraphicsItem,然后重新实现各自的鼠标事 ...

知道怎么做了,MyItem *item = new MyItem(QGraphicsView::mapToScene(rect).boundingRect());一句话搞定,bug也解决了,原来事件传递是有顺序的,从view传到item,加了一个全局变量,终于完全实现拖动和缩放功能了。
回复 支持 反对

使用道具 举报

累计签到:1570 天
连续签到:1 天
2015-11-24 00:01:23 显示全部楼层
wwj_ff 发表于 2015-11-23 23:00
知道怎么做了,MyItem *item = new MyItem(QGraphicsView::mapToScene(rect).boundingRect());一句话搞定 ...

嗯嗯。不错不错,建议完成后在论坛发个教学贴,分享下经验。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了