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

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

概述

用Qt鼠标事件实现基本几何图形的绘制,支持直线、矩形、圆形、椭圆。后期可以在此基础上进行扩展。

效果图

qt 鼠标绘制矩形,qt,Powered by 金山文档

实现

本示例使用QGraphics体系来实现,因为要移动对象,所以生成的图形必须是一个单独的对象,鼠标拖动绘制的过程是在临时层中完成,release后生成一个矢量的图形item并添加到场景中。

关键代码

主场景中有一个父rootItem,在scene中将鼠标或触控事件传到rooitem后动态绘制临时的图形,release事件后生成一个标准的图形对象:

本示例使用QGraphics体系来实现,因为要移动对象,所以生成的图形必须是一个单独的对象,鼠标拖动绘制的过程是在临时层中完成,release后生成一个矢量的图形item并添加到场景中。

关键代码

主场景中有一个父rootItem,在scene中将鼠标或触控事件传到rooitem后动态绘制临时的图形,release事件后生成一个标准的图形对象:

void GsRootItem::drawPress(int id, const QPointF &p)
{
    ShapeInfo info;
    info.firstPos = p;
    info.type = getCurType();
    m_Objs.insert(id,info);
}

void GsRootItem::drawMove(int id, const QPointF &lastPoint, const QPointF &curPoint)
{
    if(!m_Objs.contains(id)){
        return;
    }
    ShapeInfo info = m_Objs.value(id);
    m_pTempLayer->drawShape(info.type,info.firstPos,curPoint);
}

void GsRootItem::drawRelease(int id, const QPointF &point)
{
    if(!m_Objs.contains(id)){
        return;
    }
    ShapeInfo info = m_Objs.value(id);
    drawRealShape(info.type,info.firstPos,point);
    m_Objs.remove(id);
    m_pTempLayer->clear();
}

...
void GsRootItem::drawRealShape(GsShapeType type, QPointF p1, QPointF p2)
{
    //计算图形绘制区域
    QRectF rect;
    rect.setX(qMin(p1.x(),p2.x()));
    rect.setY(qMin(p1.y(),p2.y()));
    if(type == Shape_Circle){
        rect.setWidth(qAbs(p1.y() - p2.y()));
        rect.setHeight(qAbs(p1.y() - p2.y()));
    }
    else{
        rect.setWidth(qAbs(p1.x() - p2.x()));
        rect.setHeight(qAbs(p1.y() - p2.y()));
    }
    rect.adjust(-5,-5,5,5);
    GsShapeBaseItem * item = m_pShapeFactory->getShapeItem(type,rect,this);
    item->drawShape(p1,p2);
}

drawRealShape函数就是用于创建一个独立的几何图形,通过以下的工厂模式来生成

 GsShapeBaseItem * item = m_pShapeFactory->getShapeItem(type,rect,this);

工厂代码:

GsShapeBaseItem *GsShapeFactory::getShapeItem(GsShapeType type,QRectF rectF,
                                              QGraphicsObject *parent)
{
    GsShapeBaseItem * item = nullptr;
    switch (type) {
    case Shape_Line:
        item = new GsShapeLineItem(rectF,parent);
        break;
    case Shape_Rectange:
        item = new GsShapeRectangeItem(rectF,parent);
        break;
    case Shape_Circle:
        item = new GsShapeCircleItem(rectF,parent);
        break;
    case Shape_Oval:
        item = new GsShapeOvalItem(rectF,parent);
        break;
    default:
        break;
    }
    item->setZValue(10);
    return item;
}

在工厂类中会创建不同的图形对象。每一个图形对象是继承于QGraphicsObject然后重写paint函数去进行绘制,比如说原型:

void GsShapeCircleItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    painter->setRenderHint(QPainter::Antialiasing);
    QColor color = Qt::red;//(rand()%255,rand()%255,rand()%255);
    painter->setBrush(color);
    if(m_bTap){
        painter->setPen(QPen(Qt::yellow,5,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin));
    }
    else{
        painter->setPen(QPen(color,3,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin));
    }
    painter->drawEllipse(m_firstPoint.x(),m_firstPoint.y(),
                         qAbs(m_lastPoint.y() - m_firstPoint.y()),
                         qAbs(m_lastPoint.y() - m_firstPoint.y()));
}

其他图形类似。

实现图形的选择和拖动,需要在item中添加以下两句:

setFlag(ItemIsSelectable,true);
setFlag(ItemIsMovable,true);

然后就可以自由拖动啦。

基本逻辑都很简单。文章来源地址https://www.toymoban.com/news/detail-645755.html

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

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

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

相关文章

  • SVG的一些基础知识,包括SVG坐标系统、支持的几何图形和样式,动画的基础知识,包括基本动画和路径动画

    SVG(可缩放矢量图形)是一种使用XML格式定义的图像格式,它可以将二维图像呈现为任意大小的图像,而不会产生像素化。由于它的矢量设计,SVG成为了实现各种图形和动画的理想平台。在本文中,我们将探讨如何使用SVG实现图形和动画。 在开始之前,让我们首先了解一下

    2024年02月03日
    浏览(57)
  • Qt中QGraphicsView架构下实时鼠标绘制图形

    上一章节介绍了关于QGraphicsView的基础讲解,以及简单的类图创建,由上一章节中最后展示的动画效果来看,今年主要讲述如何在QGraphicsView架构下,实时拖动鼠标绘制图形! 今天主要以矩形为例,再来看一下展示效果吧! 想要实现鼠标拖拽绘图的效果,离不开鼠标的三大事件

    2024年01月22日
    浏览(44)
  • Qt—QPainter基本图形绘制详解

    1、QPainter 类在小部件和其他绘制设备上执行低级绘制。 2、QPainter 提供了高度优化的功能来完成大多数图形GUI程序所需的工作。它可以画从简单的线条到复杂的形状。它还可以绘制对齐的文本和像素图。QPainter 可以对继承 QPaintDevice 类的任何对象进行操作。 3、QPainter 与 QPai

    2024年02月02日
    浏览(43)
  • 【matplotlib基础】--几何图形

    除了绘制各类分析图形(比如柱状图,折线图,饼图等等)以外, matplotlib 也可以在画布上任意绘制各类几何图形。 这对于计算机图形学、几何算法和计算机辅助设计等领域非常重要。 matplitlib 中的 patches 类提供了丰富的几何对象, 本篇抛砖引玉,介绍其中几种常用的几何

    2024年02月08日
    浏览(50)
  • PostGIS:几何图形输出

    5.9.1. Well-Known Text (WKT) 5.9.1.1. ST_AsEWKT ST_AsEWKT -返回具有SRID元数据的几何体的已知文本(WKT)表示。 5.9.1.1.1. 概要 5.9.1.1.2. 描述 返回以SRID为前缀的几何图形的知名文本表示形式。可选参数可用于减少输出中使用的浮点数后的最大十进制位数(默认为15)。 此函数支持3d,并且不会删

    2024年02月16日
    浏览(37)
  • 计算机图形学:二维图形的几何变换(算法原理及代码实现)

    对于一个二维图形作平移、旋转、放缩变换,可以转换为在二维坐标系中图形的所有点分别可以对应到在x,y轴方向分别平移tx,ty(平移)、绕一点旋转固定的角(旋转)、在x,y轴方向分别放缩sx,sy倍。 对于变换的原理,只需要将原图形的点通过极坐标或者相加、相乘,再

    2024年02月11日
    浏览(51)
  • 图形几何学——圆形:圆弧与曲率

    A、B、C分别是参考线的某三个连续的离散点,abc分别是其对边。根据三角形外接圆相关性质,通过作三条边的中垂线的交点可以求得三角形的外接圆心。连接CO并延长交圆周于点D,由于 近似认为 ∣ P 1 ⃗ ∣ = ∣ P 2 P 3 ⃗ ∣ = d s |vec{P_1}| = |vec{P_2P_3}| = ds ∣ P 1 ​ ​ ∣ = ∣

    2024年04月27日
    浏览(76)
  • Procedural Mesh: 创建复杂的3D几何图形

    Procedural Mesh 是一个用于创建复杂3D几何图形的开源库,由 Morten Nobel 开发并维护。它允许开发者通过程序化的方式生成各种形状和结构,无需手动设计每个顶点和面。 Procedural Mesh 提供了一系列函数和工具,可以帮助开发者轻松地生成自定义的3D网格。这些功能包括: 基础形状

    2024年03月15日
    浏览(42)
  • 几何引擎 & 约束求解器 & 3D仿真物理引擎 & 图形引擎

    四大技术图谱就像四座护法金刚,形成了深不可测的技术鸿沟。这对于任何一个工业软件企业,十年发展的沉淀,那还只是开始。这条路,太漫长了。 Software Vendor Domain 3D-kernel 4MCAD IntelliCAD 4M S.A., Greece CAD, AEC Open CASCADE Technology Adams MSC Software, USA CAE Parasolid ADEM ADEM, Russia-Israel

    2024年02月08日
    浏览(39)
  • 计算机视觉 图像形成 几何图形和变换 3D到2D投影

            现在我们知道如何表示2D和3D几何图元以及如何在空间上转换它们,我们需要指定如何将 3D图元投影到图像平面上。 我们可以使用线性3D到2D投影矩阵来做到这一点。最简单的模型是正交法,它不需要除法就可以得到最终的(不均匀的)结果。更常用的模型是透视,

    2023年04月08日
    浏览(64)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包