系列文章目录

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图元拖动绘制(二)相关推荐

  1. QGraphicsItem图元旋转缩放和自定义图元(三)

    系列文章目录 QGraphicsItem图元的简单使用(一) QGraphicsItem图元拖动绘制(二) 文章目录 系列文章目录 前言 一.缩放和旋转 二.自定义图元 总结 前言 接上一章,图元绘制 ...

  2. QGraphicsItem图元坐标和在场景中的坐标(六)

    系列文章目录 QGraphicsItem图元的简单使用(一) QGraphicsItem图元拖动绘制(二) QGraphicsItem图元旋转缩放和自定义图元(三) QGraphicsItem鼠标拖动 ...

  3. QGraphicsItem图元的简单使用(一)

    系列文章目录 文章目录 系列文章目录 前言 一.图元的三要素 二.坐标系统 1.场景坐标 2.视图坐标 3.图元坐标 4.坐标变换函数 三.简单演示 四.使用步骤 1.界面布局 2.添加图元 总结 前 ...

  4. matlab常见用法汇总,包括绘制二维、三维曲线、圆、读取、保存图片/数据、数值精度、绘制圆、绘制角度等

    文章目录 写在前面 一 绘制二维曲线 二 绘制三维曲线 plot3. 三 绘制三维离散点 scatter3() 四 保存图片到本地 五 数值精度 六 字符串拼接 七 将数据保存到txt 八 matla ...

  5. R语言绘制二维密度图

    R语言绘制二维密度图 二维密度图显示了两个数值变量之间的关系,一个在x轴上表示,另一个在Y轴上表示,与散点图类似,然后计算二维空间中特定区域内的观测数,并用颜色梯度表示.二维密度图有几种类型,以下主要 ...

  6. R语言ggplot2可视化绘制二维的密度图:在R中建立二维散点数据的连续密度热图、2D密度估计、MASS包中的kde2d函数实现2D密度估计、geom_density2d函数可视化二维密度图

    R语言ggplot2可视化绘制二维的密度图:在R中建立二维散点数据的连续密度热图.2D密度估计.MASS包中的kde2d函数实现2D密度估计.geom_density2d函数可视化二维密度图 目录

  7. python画二维散点图-python3实现绘制二维点图

    如下所示: import matplotlib.pyplot as plt plt.plot([1,2,3],[4,5,6],'ro') plt.show()#这个智障的编辑器,,,看来高版本的确修复 ...

  8. 【MATLAB】二维绘图 ( 绘制二维图像 | 设置图像样式 )

    文章目录 一.绘制二维图像 1.二维绘图步骤 2.二维绘图步修饰 3.代码示例 二.设置图像参数 1.图像参数 2.代码示例 一.绘制二维图像 1.二维绘图步骤 绘图前需要给定 xxx 轴 , yyy ...

  9. 深入浅出python机器学习_如何用python画(绘制)二维函数(二维图)?

    参考文档 python 如何绘制二维函数? from matplotlib import pyplot as plt import numpy as np low=lambda x:10000 if ...

最新文章

  1. f-free 查看系统中空闲和使用的内存
  2. 深入理解pthread_cond_wait、pthread_cond_signal
  3. gcvt字符串转换函数应用实例
  4. 数据库对象管理 (表)
  5. php字符串类型详解,php数字类型之字符串类型详解
  6. asp.net网页中导出EXCEL,WORD的环境设置验证实例
  7. Assembly is incorrectly specified as a file
  8. Online Coding开发模式 (通过在线配置实现一个表模型的增删改查功能,无需写任何代码)
  9. yolov3为什么对大目标检测不好_【目标检测简史】进击的YOLOv3,目标检测网络的巅峰之作...
  10. [python] 1.解释器
  11. python数据存储系列教程——python中mysql数据库操作:连接、增删查改、指令执行
  12. Bmob移动后端云服务平台--Android从零開始--(二)android高速入门
  13. 【Gym - 101234J】Zero Game【单调队列】
  14. 小白的入门之——汇编语言程序设计教程
  15. matlab逐步线性回归分析法,[转载]matlab 回归分析
  16. Carson带你学设计模式:这是一份全面 详细的设计模式学习指南
  17. 水星路由器wan口ip显示0_水星路由器WAN口获取不到ip地址怎么办?
  18. 【渝粤题库】陕西师范大学900013 心身疾病防治与心理健康
  19. Leetcode 1087. Brace Expansion
  20. sort()函数排序vector

热门文章

  1. Landsat系列卫星介绍及影像下载
  2. Python print 玩转点阵字
  3. EDA之立创EDA专业版使用(原理图绘制)
  4. 浅谈VMware的NAT模式
  5. java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
  6. 【.NET学习】.NET入门及学习路线
  7. 什么是机器学习(ML)
  8. C++ 中scanf的返回值
  9. 通过sql注入窃取用户数据库信息
  10. Python金融学-风险中性测度