Qt 实现涂鸦板三:实现鼠标绘制矩形

.h 文件

#pragma once

#include <QtWidgets/QWidget>
#include "ui_xuexi.h"

#include "QMouseEvent"
#include "QKeyEvent"
#include "QPainter"

class xuexi : public QWidget
{
    Q_OBJECT

public:
    xuexi(QWidget *parent = Q_NULLPTR);

    void mousePressEvent(QMouseEvent*e);        // 按下
    void mouseMoveEvent(QMouseEvent*e);         // 移动
    void mouseReleaseRvent(QMouseEvent*e);      // 释放

    void paintEvent(QPaintEvent* );
     

private:
    Ui::xuexiClass ui;

    QPixmap pix;
    QPoint lastPoint;
    QPoint endPoint;

    QPixmap tempPix;
    bool isDrawing;                             // 标志是否在绘图
};

.cpp 文件

#include "xuexi.h"

xuexi::xuexi(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);

    resize(600, 500);
    pix = QPixmap(400, 400);
    pix.fill(Qt::white);

    isDrawing = false;
}

void xuexi::mousePressEvent(QMouseEvent*e)
{
    if (e->button() == Qt::LeftButton)
    {
        lastPoint = e->pos();
        isDrawing = true;
    }
}

void xuexi::mouseMoveEvent(QMouseEvent*e)
{
    if (e->buttons() == Qt::LeftButton)
    {
        endPoint = e->pos();
        update();
    }
}

void xuexi::mouseReleaseRvent(QMouseEvent* e)
{
    if (e->button() == Qt::LeftButton)
    {
        endPoint = e->pos();
        isDrawing = false;
        update();
    }
}

void xuexi::paintEvent(QPaintEvent*)
{
    int x, y, w, h;
    x = lastPoint.x();
    y = lastPoint.y();
    w = endPoint.x() - x;
    h = endPoint.y() - y;
    
    QPainter painter(this);
    if (isDrawing)
    {
        tempPix = pix;
        QPainter pp(&tempPix);
        pp.drawRect(x, y, w, h);
        painter.drawPixmap(0, 0, tempPix);
    }
    else
    {
        QPainter pp(&pix);
        pp.drawRect(x, y, w, h);
        painter.drawPixmap(0, 0, pix);
    }
    

}
原文地址:https://www.cnblogs.com/shiyixirui/p/15511176.html