0


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 {classCMainWindow;}
QT_END_NAMESPACE

classCMainWindow:public QMainWindow
{
    Q_OBJECT

public:CMainWindow(QWidget *parent =nullptr);~CMainWindow();private:
    Ui::CMainWindow *ui;// QWidget interfaceprotected:/**
     * @brief paintEvent 绘制事件
     * @param event 绘制事件对象
     */voidpaintEvent(QPaintEvent *event);// QWidget interfaceprotected:/**
     * @brief mouseReleaseEvent 鼠标释放事件
     * @param event 鼠标事件对象
     */voidmouseReleaseEvent(QMouseEvent *event);/**
     * @brief mouseMoveEvent 鼠标移动事件
     * @param event 鼠标事件对象
     */voidmouseMoveEvent(QMouseEvent *event);/**
     * @brief mouseMoveEvent 鼠标按下事件
     * @param event 鼠标事件对象
     */voidmousePressEvent(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/)

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

标签: qt ui 开发语言

本文转载自: https://blog.csdn.net/wj584652425/article/details/129511044
版权归原作者 lw向北. 所有, 如有侵权,请联系我们删除。

“Qt之QPainter绘制多个矩形/圆形(含源码+注释)”的评论:

还没有评论