首页 > 作文

Qt实现实时鼠标绘制图形

更新时间:2023-04-04 22:47:06 阅读: 评论:0

目录
功能实现1:记录图形第一个绘制点2:实时获取鼠标最新位置并绘图3:释放绘制点,绘制最终图形总结

上一章节介绍了关于qgraphicsview的基础讲解,以及简单的类图创建,由上一章节中最后展示的动画效果来看,今年主要讲述如何在qgraphicsview架构下,实时拖动鼠标绘制图形!

今天主要以矩形为例,再来看一下展示效果吧!

功能实现

想要实现鼠标拖拽绘图的效果,离不开鼠标的三大事件:按下、移动、释放

那么具体实现实时绘制矩形框的核心流程是什么呢?

第一步:鼠标左键点击,记录初始点击位置

第二步:在窗口中移动鼠标,实时获取鼠标拖动点,根据拖动点绘制指定形状

第三步:鼠标点击右键释放鼠标,绘制最终图形

描述的实现流程很简单,那么,接下来就实际操作吧!

在进行鼠标点击绘制的时候,为了兼容多个图形的实时绘制,这里,不只是用两个qpoint成员变量记录鼠标点,而是采取了vector<qpontf>容器存储的方式。

例如:三角形图形,需要三个点才能确定图形;曲线图形,是由n多个点才能确定图形;等等。。。

所以说,这里采用了vector容器进行数据存储,任何图形的点都可以进行存储。

所有的图形枚举类型,如下表格:

枚举类型形状drawing_normal无图形绘制drawing_circular圆形drawing_straightline直线drawing_rectangular矩形drawing_triangle三角形drawing_manylinegements多线段drawing_curve曲线

今天只讲述 矩形:drawing_rectangular

1:记录图形第一个绘制点

只有鼠标点击后才能获取当前点击点的位置,所以,记录按下点操作应该是在鼠标的moupresvent中实现的。

void qcustomqgraphicsscene::moupresvent(qgraphicsscenemouevent * e){//todo:鼠标左键,点击绘制图形;鼠标右键,点击拖动图形qgraphicsscene::moupresvent(e);if (e->button() & qt::leftbutton){                //当图形处于绘制状态时if (m_enumshape!= drawing_normal){//记录鼠标按下的点                        m_vetpoints.push_back(e->scenepos());}}}
营销战略

代码解析:当进入到鼠标按下消息后,只有在左键按下状态时,才做绘图操作,并且当前形状枚举类型有效。

2:实时获取鼠标最新位置并绘图

鼠标想要实时绘制,那一定是在鼠标的moumoveevent事件中操作的。

void qcustomqgraphicsscene::moumoveevent(qgraphicsscenemoueve学做西餐nt * e){//todo:鼠标移动时,如果存在有效图形类型,进行图形绘制qgraphicsscene::moumoveevent(e);if (m_enumshape!= drawing_normal){                m_ptemplayer->drawshape(m_enumshape, m_vetpt, e->scenepos());}}

代码解析:当鼠标进入到moumoveevent事件后,并且,当前枚举类型处于有效状态时,需要实时绘制图形。

函数drawshape的讲解:

参数1:图形的枚举类型,根据不同枚举,绘制不同的图形

参数2:vector<qpointf>传入已经记录的鼠标点,可以是多个,但最少是1个。就例如当前绘制矩形来说,该容器中只是存储了一个绘制点。

参数3:鼠标在moumoveevent中实时拖动点

drawshape函数实现代码,如下:

void qtempcanvaslayer::drawshape(enum_drawingg元宵节后打一字raphic enumshape, std::vector<qpointf> vetpt, qpointf ptcurrent){m_ptempcanvasimg->fill(qt::transparent);m_ptemppainter->trenderhint(qpainter::antia七十华诞liasing, true);m_ptemppainter->tcompositionmode(qpainter::compositionmode_source);m_ptemppainter->tpen(qpen(qcolor(51, 51, 51), 1, qt::solidline, qt::squarecap, qt::roundjoin));switch (enumshape){ca drawing_circular: //圆形break;ca drawing_straightline: //直线break;ca drawing_rectangular: //矩形m_ptemppainter->drawrect(qrectf(vetpt[0], ptcurrent));break;ca drawing_triangle: //三角形break;ca drawing_manylinegements: //多线段break;ca drawing_curve: //曲线break;default:break;}update();}

代码讲解:switch语句之前的内容都是在设置图形的风格,比如:trenderhint防止图形走样;最需要我们注意的是下面一句代码:

m_ptempcanvasimg->fill(qt::transparent);

如果你忘记设置了,当鼠标在拖动绘制图形时,会导致拖拽线条重叠的效果,就如下面展示效果一样,如图所示:

3:释放绘制点,绘制最终图形

鼠标事件:moureleaevent

void qcustomqgraphicsscene::moureleaevent(qgraphicsscenemouevent * e){//todo:鼠标释放之后操作qgraphicsscene::moureleaevent(e);if (m_enumshape == drawing_normal){return;}//存在有效的图形类型,进行最终图形绘制if (e->button() & qt::rightbutton){if (m_enumshape == drawing_rectangular){//绘制直线,需要存储两个有效点if (m_vetpt.size() == 2){this->drawrealshape(m_vetpt);                        鸭蛋一打有多少个        //如果当前正在绘制图形,直接清除this->clearcurrentdrawingshape(); }}}}

代码解析:触发了鼠标释放事件后,并且是鼠标右键点击(在这里都是以鼠标右键点击作为最终的图形绘制完成),此时,根据不同的枚举类型进行图形绘制。

对于矩形图形来说,只需要两个有效的点就会完整对图形的绘制,其中this->drawrealshape中进行最终点的绘制。

一个图形数据绘制成功之后,需要将上一次存储的临时点进行清除,以备后续图形绘制使用,说白了,也就是vector<qpointf>容器需要清除

实现完成了鼠标的三大事件,一个完整的实时鼠标图形绘制思路已经完成了。

总结

实现鼠标实时绘图的功能,无论是mfc框架还是qt框架,基本原理都是一致的,基本上不会离开鼠标的三大事件。

到此这篇关于qt实现实时鼠标绘制图形的文章就介绍到这了,更多相关qt鼠标绘制图形内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

本文发布于:2023-04-04 22:47:05,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/e45941b88213c4c385d8aa23dbcda11a.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:Qt实现实时鼠标绘制图形.doc

本文 PDF 下载地址:Qt实现实时鼠标绘制图形.pdf

标签:鼠标   图形   实时   矩形
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图