当前位置: 首页 > article >正文

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

一、绘制示例图

下图绘制的是矩形对象,但是将绘制矩形函数(drawRect)更改为绘制圆形(drawEllipse)即可绘制圆形。
请添加图片描述

二、思路解释

  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/)

注:文章为作者编程过程中所遇到的问题和总结,内容仅供参考,若有错误欢迎指出。
注:如有侵权,请联系作者删除


http://www.kler.cn/a/1432.html

相关文章:

  • java1-相对路径与绝对路径
  • 透明部署、旁路逻辑串联的区别
  • nginx 1.6.3配置虚拟主机与rewrite-location匹配规则
  • Python入门教程 —— 网络编程
  • Flutter:封装一个自用的bottom_picker选择器
  • STM32烧写失败之Contents mismatch at: 0800005CH (Flash=FFH Required=29H) !
  • Linux中日志管理和常见故障
  • “国产版ChatGPT”文心一言发布会现场Demo硬核复现
  • 学习28个案例总结
  • 2022-2023年度广东省职业院校学生专业技能大赛 中职组网络安全赛项竞赛规程
  • 用chatgpt写insar地质灾害的论文,重复率只有1.8%,chatgpt4.0写论文不是梦
  • 从零开始学Python第02课:第一个Python程序
  • 攻防世界reverse-box
  • 「业务架构」TOGAF建模之业务架构:组织分解图(组织映射)
  • C#中的DataGridView中添加按钮并操作数据
  • 学习其他人的代码,成为更好的程序员
  • Verilog 运算符简介
  • Go单元测试
  • Three.js——learn02
  • 动手做个mini智能助理--数据准备(2)
  • chatGPT之Python API启用上下文管理
  • Keil MDK6要来了,将嵌入式软件开发水平带到新高度,支持跨平台(2023-03-11)
  • JavaScript学习笔记(7.0)
  • 【Vue】Vue的安装
  • 【SCL】实现简单算法--冒泡排序
  • 前端面试题