Qt中QGraphicsView架构下实时鼠标绘制图形

这篇具有很好参考价值的文章主要介绍了Qt中QGraphicsView架构下实时鼠标绘制图形。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

Qt中QGraphicsView架构下实时鼠标绘制图形,Qt,计算机外设,qt

功能实现

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

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

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

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

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

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

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

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

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

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

Qt中QGraphicsView架构下实时鼠标绘制图形,Qt,计算机外设,qt

今天只讲述 矩形:Drawing_Rectangular

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

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

void QCustomQGraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent * e)
{
	//TODO:鼠标左键,点击绘制图形;鼠标右键,点击拖动图形
	QGraphicsScene::mousePressEvent(e);

	if (e->button() & Qt::LeftButton)
	{
                //当图形处于绘制状态时
		if (m_enumShape!= Drawing_Normal)
		{
			//记录鼠标按下的点
                        m_vetPoints.push_back(e->scenePos());
		}
	}
}

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

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

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

void QCustomQGraphicsScene::mouseMoveEvent(QGraphicsSceneMouseEvent * e)
{
	//TODO:鼠标移动时,如果存在有效图形类型,进行图形绘制
	QGraphicsScene::mouseMoveEvent(e);
	if (m_enumShape!= Drawing_Normal)
	{
                m_pTempLayer->DrawShape(m_enumShape, m_vetPt, e->scenePos());
	}

}

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

函数DrawShape的讲解

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

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

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

DrawShape函数实现代码,如下:

void QTempCanvasLayer::DrawShape(ENUM_DrawingGraphic enumShape, std::vector<QPointF> vetPt, QPointF ptCurrent)
{
	m_pTempCanvasImg->fill(Qt::transparent);
	m_pTempPainter->setRenderHint(QPainter::Antialiasing, true);
	m_pTempPainter->setCompositionMode(QPainter::CompositionMode_Source);
	m_pTempPainter->setPen(QPen(QColor(51, 51, 51), 1, Qt::SolidLine, Qt::SquareCap, Qt::RoundJoin));
	switch (enumShape)
	{
	case Drawing_Circular: //圆形
		break;
	case Drawing_StraightLine: //直线
		break;
	case Drawing_Rectangular: //矩形
		m_pTempPainter->drawRect(QRectF(vetPt[0], ptCurrent));
		break;
	case Drawing_Triangle: //三角形
		break;
	case Drawing_ManyLineSegements: //多线段
		break;
	case Drawing_Curve: //曲线
		break;
	default:
		break;
	}
	update();
}

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

m_pTempCanvasImg->fill(Qt::transparent);

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

Qt中QGraphicsView架构下实时鼠标绘制图形,Qt,计算机外设,qt

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

鼠标事件:mouseReleaseEvent

void QCustomQGraphicsScene::mouseReleaseEvent(QGraphicsSceneMouseEvent * e)
{
	//TODO:鼠标释放之后操作
	QGraphicsScene::mouseReleaseEvent(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框架,基本原理都是一致的,基本上不会离开鼠标的三大事件。

我是糯诺诺米团,一名C++开发程序媛~文章来源地址https://www.toymoban.com/news/detail-813849.html

到了这里,关于Qt中QGraphicsView架构下实时鼠标绘制图形的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Qt鼠标拖动绘制基本几何图形

    Qt鼠标拖动绘制基本几何图形

    用Qt鼠标事件实现基本几何图形的绘制,支持直线、矩形、圆形、椭圆。后期可以在此基础上进行扩展。 效果图 实现 本示例使用QGraphics体系来实现,因为要移动对象,所以生成的图形必须是一个单独的对象,鼠标拖动绘制的过程是在临时层中完成,release后生成一个矢量的图

    2024年02月13日
    浏览(12)
  • Qt:界面实时响应鼠标拖动绘制

    Qt:界面实时响应鼠标拖动绘制

    采用双缓冲实现界面实时响应鼠标的拖动绘制。 思想如下:首先需要两张画布pix和tempPix,他们都是QPixmap实例;pix用来保存初始界面或上一阶段以完成的绘制;tempPix用来作为鼠标拖动时的实时界面绘制;当鼠标左键按下后拖动时每次都将将pix赋值给tempPix,然后用tempPix进行绘

    2024年02月11日
    浏览(12)
  • QGraphicsView通过鼠标操作来绘制图元

    QGraphicsView通过鼠标操作来绘制图元

    在Visio和MindManager等类似的图元操作软件中,很多时候我们会通过鼠标操作来添加自定义的图元。这里就介绍一下如何在QT的图形视图框架中通过鼠标绘制来添加图元。 在实现的时候我们先添加一个自定义图元用来响应鼠标操作,自定义图元的实现如下所示. 辅助图元类似于标

    2024年02月13日
    浏览(50)
  • QGraphicsView制作绘制图元工具资料整理(鼠标、平移、缩放)

    QGraphicsView制作绘制图元工具资料整理(鼠标、平移、缩放)

    QGraphicsView制作绘制工具资料整理 继承自QGraphicsView的类中使用QGraphicsSceneMouseEvent 简单显示图片的示例 Qt之QGraphicsView入门篇 Qt之QGraphicsView入门篇 鼠标事件和滚轮事件 鼠标事件和滚轮事件 QGraphicsItem的缩放 QGraphicsItem的缩放 QT官方文档:QGraphicsItem Class QGraphicsItem Class Qt之QGraph

    2024年02月09日
    浏览(12)
  • QT QGraphicsView 在鼠标点击处进行放大缩小

    QT QGraphicsView 在鼠标点击处进行放大缩小

    一、前段时间在用QGraphicsView对图元进行放大缩小时,发现图形总是越来越跑偏,无法像地图中那样,点击哪里就能放大哪个地方。 如下所示:此时放大缩小的焦点并不在鼠标位置 方法,使用QGraphicsView类的设置属性函数.在构造函数中增加下面两个函数即可。 此时以鼠标为中

    2024年02月16日
    浏览(14)
  • 【[Qt]基于QGraphicsView的图像显示控件,支持放大、缩小、鼠标拖动】

    【[Qt]基于QGraphicsView的图像显示控件,支持放大、缩小、鼠标拖动】

    ImageViewer.h文件 ImageViewer.cpp 文件 具体使用代码如下 1、初始化类对象,并加入界面布局中 2、打开图像,并加载到控件中 3、从控件中卸载图片 源码链接:https://download.csdn.net/download/xiaohuihuihuige/87239431 百度云: 链接:https://pan.baidu.com/s/1W-KUlIKUFAktUKFin63N0g 提取码:4g8a

    2024年02月11日
    浏览(51)
  • Qt中QGraphicsView总体架构学习

    Qt中QGraphicsView总体架构学习

    前段时间学习了下如何在QGraphicsView架构中绘制刻度尺,主要是与OnPainter中进行比较的,那么今天就来详细讲解下我对QGraphicsView框架的认知吧~ 最近一段时间想学习下,如果我有不正确的,欢迎留言探讨哟~ 使用过OnPainter绘制过图形的,QPainter绘制需要在绘制设备的paintEvent()事

    2024年02月02日
    浏览(15)
  • 【计算机图形学】作业:Bresenham 法绘制圆

    请采用 Bresenham 法绘制圆(共 30 分)。要求: (1) 给出算法的文字描述(共 15 分)。 (2) 编写函数,在给定圆心坐标和半径的情况下,计算出圆 上所有的点,并将这些点存储在数组中(共 15 分)。 输入圆的圆心(xc,yc),半径r。数组circlepoints为输出,保存圆上所有点。 初

    2024年01月24日
    浏览(13)
  • 计算机图形学:绘制一个3d交互场景(1)

    计算机图形学:绘制一个3d交互场景(1)

    OpenGL作为一种图形与硬件的接口,与其他图形程序开发工具相比较,它提供了众多图形函数,直观的编程环境简化了三维图形的绘制过程,使用OpenGL搭建一个三维场景,能够通过输入设备与场景内物体交互。 豪华单间 配置环境:vs22+freeglut库 1.绘制墙体使其成为封闭空间,在

    2024年02月11日
    浏览(51)
  • 【计算机图形学】【实验报告】太阳系绘制、B样条曲线绘制(附代码)

    【计算机图形学】【实验报告】太阳系绘制、B样条曲线绘制(附代码)

    实 验 报 告 一、实验目的 掌握三维图形的显示原理和方法,掌握三维观察的原理和方法; 掌握OpenGL中矩阵堆栈函数的使用,会使用堆栈函数进行复杂场景的组装。 掌握OpenGL中三维观察变换常用的函数的使用方法,了解三维模型的贴图方法; 掌握自由曲线的生成方法,熟练

    2024年02月10日
    浏览(15)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包