QGraphicsItem图元拖动绘制(二)
系列文章目录
QGraphicsItem图元的简单使用(一)
文章目录
- 系列文章目录
- 前言
- 一、简单演示
- 二、实现代码
- 总结
前言
接上一章,上一章讲解了如何简单使用图元,通过鼠标点击绘制一个固定图元,该章将讲解如何通过鼠标拖动图元进行绘制
一、简单演示
二、实现代码
接上一章,需要重写场景类的鼠标按下和鼠标移动事件,具体代码如下
void GraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *event)
{// 记录鼠标按下起始位置m_startPos = event->scenePos();switch (m_eGraphicsType) {case Rect:{// 不传参,默认起点、长宽为0m_pCurRect = new QGraphicsRectItem();// 设置可移动、可选择m_pCurRect->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);this->addItem(m_pCurRect);// 设置图元在场景中的位置,即鼠标点击位置m_pCurRect->setPos(m_startPos);}break;case Circle:{m_pCurEllipse = new QGraphicsEllipseItem();// 设置可移动、可选择m_pCurEllipse->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);this->addItem(m_pCurEllipse);m_pCurEllipse->setPos(m_startPos);}break;case Line:{m_pCurLine = new QGraphicsLineItem();// 设置可移动、可选择m_pCurLine->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);this->addItem(m_pCurLine);m_pCurLine->setPos(m_startPos);}break;case Text:{QGraphicsTextItem* pText = new QGraphicsTextItem();// 设置可移动、可选择pText->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);// 设置文本图元可接受鼠标、键盘的编辑pText->setTextInteractionFlags(Qt::TextEditorInteraction);// 设置文本图元的堆叠顺序,如果两个图元叠加在一起,值越大的在上面pText->setZValue(1000.0);this->addItem(pText);pText->setPos(m_startPos.x() - pText->boundingRect().width() / 2.0, m_startPos.y() - pText->boundingRect().height() / 2.0);}break;case Pixmap:{QGraphicsPixmapItem* pPixmap = new QGraphicsPixmapItem(QPixmap(u8":/image/dog.png"));// 设置可移动、可选择pPixmap->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);this->addItem(pPixmap);pPixmap->setPos(m_startPos.x() - pPixmap->boundingRect().width() / 2.0, m_startPos.y() - pPixmap->boundingRect().height() / 2.0);}break;default:break;}return QGraphicsScene::mousePressEvent(event);
}void GraphicsScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{QPointF curPos = event->scenePos();switch (m_eGraphicsType) {case Rect:{// 通过左上和右下点来确定绘制一个矩形qreal dTopLeftX{0}, dTopLeftY{0}, dBottomRightX{0}, dBottomRightY{0};// 因为鼠标左键点击时,创建了一个空的矩形图元,默认矩形本身的起始坐标为(0,0),有四个方向可以拖动绘制(左上、左下、右上、右下),所以需要重新设置图元的起始坐标if(curPos.x() < m_startPos.x() && curPos.y() < m_startPos.y()) // 鼠标左上方向拖动{// 先确定左上角的点,右下角为(0,0)dTopLeftX = curPos.x() - m_startPos.x();dTopLeftY = curPos.y() - m_startPos.y();}else if(curPos.x() < m_startPos.x() && curPos.y() > m_startPos.y()) // 鼠标左下方向拖动{// 先确定左上角的点的x坐标dTopLeftX = curPos.x() - m_startPos.x();// 再确定右下角的点的y坐标dBottomRightY = curPos.y() - m_startPos.y();}else if(curPos.x() > m_startPos.x() && curPos.y() < m_startPos.y()) // 鼠标右上方向拖动{// 先确定左上角的点的y坐标dTopLeftY = curPos.y() - m_startPos.y();// 再确定右下角的点的x坐标dBottomRightX = curPos.x() - m_startPos.x();}else if(curPos.x() > m_startPos.x() && curPos.y() > m_startPos.y()) // 鼠标右下方向拖动{// 先确定右下角的点,左上角为(0,0)dBottomRightX = curPos.x() - m_startPos.x();dBottomRightY = curPos.y() - m_startPos.y();}m_pCurRect->setRect(QRectF(QPointF(dTopLeftX, dTopLeftY), QPointF(dBottomRightX, dBottomRightY)));}break;case Circle:{// 椭圆内部做了处理,不需向矩形一样重新计算起点坐标和宽高m_pCurEllipse->setRect(m_pCurEllipse->rect().x(), m_pCurEllipse->rect().y(), curPos.x() - m_startPos.x(), curPos.y() - m_startPos.y());}break;case Line:{// p1时线的起点,也就是(0,0),通过相减所得的相对偏移为线的终点m_pCurLine->setLine(QLineF(m_pCurLine->line().p1(), curPos - m_startPos));}break;default:break;}return QGraphicsScene::mouseMoveEvent(event);
}
总结
该章讲解了如何拖动绘制矩形、椭圆和线,以及点击手动输入文本,Qt自带的图像图元因为没有提供相关设置接口,无法拖动绘制,需要自己派生QGraphicsItem图元实现,后面再将
QGraphicsItem图元拖动绘制(二)相关推荐
- QGraphicsItem图元旋转缩放和自定义图元(三)
系列文章目录 QGraphicsItem图元的简单使用(一) QGraphicsItem图元拖动绘制(二) 文章目录 系列文章目录 前言 一.缩放和旋转 二.自定义图元 总结 前言 接上一章,图元绘制 ...
- QGraphicsItem图元坐标和在场景中的坐标(六)
系列文章目录 QGraphicsItem图元的简单使用(一) QGraphicsItem图元拖动绘制(二) QGraphicsItem图元旋转缩放和自定义图元(三) QGraphicsItem鼠标拖动 ...
- QGraphicsItem图元的简单使用(一)
系列文章目录 文章目录 系列文章目录 前言 一.图元的三要素 二.坐标系统 1.场景坐标 2.视图坐标 3.图元坐标 4.坐标变换函数 三.简单演示 四.使用步骤 1.界面布局 2.添加图元 总结 前 ...
- matlab常见用法汇总,包括绘制二维、三维曲线、圆、读取、保存图片/数据、数值精度、绘制圆、绘制角度等
文章目录 写在前面 一 绘制二维曲线 二 绘制三维曲线 plot3. 三 绘制三维离散点 scatter3() 四 保存图片到本地 五 数值精度 六 字符串拼接 七 将数据保存到txt 八 matla ...
- R语言绘制二维密度图
R语言绘制二维密度图 二维密度图显示了两个数值变量之间的关系,一个在x轴上表示,另一个在Y轴上表示,与散点图类似,然后计算二维空间中特定区域内的观测数,并用颜色梯度表示.二维密度图有几种类型,以下主要 ...
- R语言ggplot2可视化绘制二维的密度图:在R中建立二维散点数据的连续密度热图、2D密度估计、MASS包中的kde2d函数实现2D密度估计、geom_density2d函数可视化二维密度图
R语言ggplot2可视化绘制二维的密度图:在R中建立二维散点数据的连续密度热图.2D密度估计.MASS包中的kde2d函数实现2D密度估计.geom_density2d函数可视化二维密度图 目录
- python画二维散点图-python3实现绘制二维点图
如下所示: import matplotlib.pyplot as plt plt.plot([1,2,3],[4,5,6],'ro') plt.show()#这个智障的编辑器,,,看来高版本的确修复 ...
- 【MATLAB】二维绘图 ( 绘制二维图像 | 设置图像样式 )
文章目录 一.绘制二维图像 1.二维绘图步骤 2.二维绘图步修饰 3.代码示例 二.设置图像参数 1.图像参数 2.代码示例 一.绘制二维图像 1.二维绘图步骤 绘图前需要给定 xxx 轴 , yyy ...
- 深入浅出python机器学习_如何用python画(绘制)二维函数(二维图)?
参考文档 python 如何绘制二维函数? from matplotlib import pyplot as plt import numpy as np low=lambda x:10000 if ...
最新文章
- f-free 查看系统中空闲和使用的内存
- 深入理解pthread_cond_wait、pthread_cond_signal
- gcvt字符串转换函数应用实例
- 数据库对象管理 (表)
- php字符串类型详解,php数字类型之字符串类型详解
- asp.net网页中导出EXCEL,WORD的环境设置验证实例
- Assembly is incorrectly specified as a file
- Online Coding开发模式 (通过在线配置实现一个表模型的增删改查功能,无需写任何代码)
- yolov3为什么对大目标检测不好_【目标检测简史】进击的YOLOv3,目标检测网络的巅峰之作...
- [python] 1.解释器
- python数据存储系列教程——python中mysql数据库操作:连接、增删查改、指令执行
- Bmob移动后端云服务平台--Android从零開始--(二)android高速入门
- 【Gym - 101234J】Zero Game【单调队列】
- 小白的入门之——汇编语言程序设计教程
- matlab逐步线性回归分析法,[转载]matlab 回归分析
- Carson带你学设计模式:这是一份全面 详细的设计模式学习指南
- 水星路由器wan口ip显示0_水星路由器WAN口获取不到ip地址怎么办?
- 【渝粤题库】陕西师范大学900013 心身疾病防治与心理健康
- Leetcode 1087. Brace Expansion
- sort()函数排序vector
热门文章
- Landsat系列卫星介绍及影像下载
- Python print 玩转点阵字
- EDA之立创EDA专业版使用(原理图绘制)
- 浅谈VMware的NAT模式
- java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
- 【.NET学习】.NET入门及学习路线
- 什么是机器学习(ML)
- C++ 中scanf的返回值
- 通过sql注入窃取用户数据库信息
- Python金融学-风险中性测度