Qt之QPainter绘制多个矩形/圆形(含源码+注释)

这篇具有很好参考价值的文章主要介绍了Qt之QPainter绘制多个矩形/圆形(含源码+注释)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、绘制示例图

下图绘制的是矩形对象,但是将绘制矩形函数(drawRect)更改为绘制圆形(drawEllipse)即可绘制圆形。
Qt之QPainter绘制多个矩形/圆形(含源码+注释)

二、思路解释

  1. 绘制矩形需要自然要获取矩形数据,因此通过鼠标事件获取每个矩形的rect数据(鼠标按下为起始点,鼠标释放为结束点;每次移动时的当前位置做结束点,并实时刷新,实现图形跟随鼠标绘制);
  2. 因为需要绘制多个,所以存在一个中转对象(当前图形)和历史图形容器(因为每次刷新是界面全部清空重新绘制,所以需要保存历史数据);
  3. 最后在绘制事件/函数绘制当前和历史容器中的图形即可

三、源码

CMainWindow.h

#ifndef CMAINWINDOW_H
#define CMAINWINDOW_H

#include <QMainWindow>
#include <QPainterPath>
#include <QVariant>

QT_BEGIN_NAMESPACE
namespace Ui { class CMainWindow; }
QT_END_NAMESPACE

class CMainWindow : public QMainWindow
{
    Q_OBJECT

public:
    CMainWindow(QWidget *parent = nullptr);
    ~CMainWindow();

private:
    Ui::CMainWindow *ui;

    // QWidget interface
protected:
    /**
     * @brief paintEvent 绘制事件
     * @param event 绘制事件对象
     */
    void paintEvent(QPaintEvent *event);

    // QWidget interface
protected:
    /**
     * @brief mouseReleaseEvent 鼠标释放事件
     * @param event 鼠标事件对象
     */
    void mouseReleaseEvent(QMouseEvent *event);

    /**
     * @brief mouseMoveEvent 鼠标移动事件
     * @param event 鼠标事件对象
     */
    void mouseMoveEvent(QMouseEvent *event);

    /**
     * @brief mouseMoveEvent 鼠标按下事件
     * @param event 鼠标事件对象
     */
    void mousePressEvent(QMouseEvent *event);

private:
    QPoint                  m_startPos; // 鼠标按下起始位置

    QRect                   m_tmpRect;  // 当前rect对象

    QList<QRect>            m_listRect; // 历史rect容器

};
#endif // CMAINWINDOW_H

CMainWindow.cpp

#include "CMainWindow.h"
#include "ui_CMainWindow.h"

#include <QPainter>
#include <QMouseEvent>

CMainWindow::CMainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::CMainWindow)
{
    ui->setupUi(this);
}

CMainWindow::~CMainWindow()
{
    delete ui;
}

void CMainWindow::paintEvent(QPaintEvent *event)
{
    // 创建画笔对象
    QPainter painter(this);
    // 设置绘制对象抗锯齿
    painter.setRenderHint(QPainter::Antialiasing);
    // 绘制当前rect对象
    painter.drawRect(m_tmpRect);
    // 遍历绘制历史rect对象
    foreach(const QRect &rect, m_listRect)
    {
        painter.drawRect(rect);
    }
}

void CMainWindow::mouseReleaseEvent(QMouseEvent *event)
{
    // 当前rect对象存入
    m_listRect.append(m_tmpRect);
    // 当前rect对象置空
    m_tmpRect = QRect();
    // 重绘界面
    this->repaint(this->rect());
}

void CMainWindow::mouseMoveEvent(QMouseEvent *event)
{
    // 当前rect对象赋值
    m_tmpRect = QRect(m_startPos, event->pos());
    // 更新界面
    this->update(this->rect());
}

void CMainWindow::mousePressEvent(QMouseEvent *event)
{
    // 其实点赋值
    m_startPos = event->pos();
}


总结

文章较简单,练手即可,下章为QPainter实现画笔功能。

友情提示——哪里看不懂可私哦,让我们一起互相进步吧
(创作不易,请留下一个免费的赞叭 谢谢 o/)

注:文章为作者编程过程中所遇到的问题和总结,内容仅供参考,若有错误欢迎指出。
注:如有侵权,请联系作者删除文章来源地址https://www.toymoban.com/news/detail-424856.html

到了这里,关于Qt之QPainter绘制多个矩形/圆形(含源码+注释)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Qt—QPainter基本图形绘制详解

    Qt—QPainter基本图形绘制详解

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

    2024年02月02日
    浏览(10)
  • Qt绘制曲线图(基于qt画图QPainter)

    Qt绘制曲线图(基于qt画图QPainter)

    在没有QCharst模块时,可以使用QPainter自定义绘制曲线折线图 下面提供完整代码供参考: 直接在qt创建一个QMainWindow类的app的工程,不自动生成ui文件,然后把下面代码复制到mainwindow.cpp编译运行即可。 mainwindow.cpp: //博客:booinon //https://blog.csdn.net/boonion?spm=1011.2415.3001.5343

    2024年02月11日
    浏览(7)
  • Qt 事件过滤器使用QPainter绘制温度

    Qt的 eventFilter 是一个事件过滤器,可以用来捕获和处理Qt对象的事件。事件过滤器可以被安装到一个对象上,以便在该对象上拦截和处理包含特定类型和内容的事件。下面是 eventFilter 的简单使用介绍: 创建一个类,并继承自 QObject 。这个类将作为事件过滤器的实现。 在该类

    2024年02月12日
    浏览(11)
  • Qt关于QPainter绘制1px宽度图形带来的问题思考

    Qt关于QPainter绘制1px宽度图形带来的问题思考

    前段时间遇到这样一个问题,使用QPainter绘制直线的时候,设置了笔宽为1像素,但是绘制出来的线条却是2px宽度,而且设置的画笔颜色很明显是降低了透明度,不是最“纯正”的颜色。 当时就感觉非常奇怪,明明设置的画笔宽度是正常的,为啥绘制出来不是自己想要的样子。

    2023年04月20日
    浏览(12)
  • 【五一创作】QML、Qt Quick /Qt中绘制圆形

    有多种方法可以在 Qt Quick 中绘制圆形。以下是一些主要方法: 使用 Canvas 元素 使用 Shapes 模块: a. 使用 PathArc 和 PathLine 元素组合绘制一个完整的圆形。 b. 使用 PathEllipse 元素绘制一个椭圆形,并将其设置为圆形。 使用 Rectangle 元素绘制圆角矩形并将圆角半径设置为宽度和高

    2024年02月03日
    浏览(14)
  • 经纬度坐标为中心点生成米距离长度半径的圆形面,含java js源码+在线绘制,代码简单零依赖

    经纬度坐标为中心点生成米距离长度半径的圆形面,含java js源码+在线绘制,代码简单零依赖

    目录 java版源码 js版源码 在线绘制预览效果 关于计算的精确度 前些时间在更新我的坐标边界查询工具的时候,需要用到经纬度坐标点的距离计算,和以坐标点为中心生成一个指定距离为半径的圆,搜了一下没有找到现成简单又合适的代码,于是把自己压箱底的代码翻出来了

    2024年02月08日
    浏览(38)
  • Unity3D Shader 引导遮罩,支持圆形、矩形、圆角矩形框

    Unity3D Shader 引导遮罩,支持圆形、矩形、圆角矩形框

    unity3D新手引导遮罩,支持圆形,矩形框,圆角矩形框。图形位置和大小可以根据控件的位置和大小调节,通用所有分辨率设备。黄色区域遮挡,只有白色区域可以点穿。 原文链接:https://www.kadastudio.cn/archives/89 ​ 将MyGuideMask挂载到脚本上,然后通过GuideMask创建材质并赋值,根据

    2024年02月11日
    浏览(13)
  • C#实现限制鼠标在一个矩形或者圆形区域内工作

    C#实现限制鼠标在一个矩形或者圆形区域内工作

    目录 前言 一、界面设计 二、关键技术 1.设置矩形限制区域 2.设置圆形限制区域 3.解除限制 4.效果展示 正常情况下,鼠标的移动范围是整个屏幕,但有时需要鼠标在某一区域内移动,这个区域可以是矩形也可以是圆形,圆形会复杂一点。 窗体中需要添加三个按钮,分别是设

    2024年02月16日
    浏览(30)
  • OpenCV(10): 轮廓近似—多边形拟合,边界矩形与边界圆形

    OpenCV(10): 轮廓近似—多边形拟合,边界矩形与边界圆形

    轮廓近似(Contour Approximation)是指对轮廓进行逼近或拟合,得到近似的轮廓。在图像处理中,轮廓表示了图像中物体的边界,因此轮廓近似可以用来描述和识别物体的形状。 多边形拟合(Approximating Polygons)是将轮廓逼近成一个由直线段构成的多边形。常见的有最小包围矩形

    2024年02月10日
    浏览(52)
  • 【Unity实战篇 】| 游戏中实现镂空遮罩效果【矩形、圆形镂空遮罩】

    【Unity实战篇 】| 游戏中实现镂空遮罩效果【矩形、圆形镂空遮罩】

    前言 本文来写一下怎样在Unity中完成一个 镂空遮罩 的效果。 镂空遮罩 比较常用的有两种ÿ

    2024年02月15日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包