QT:鼠标画线(双画布)

widget.h

cpp 复制代码
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPoint>   //点
#include <QMouseEvent>  //鼠标事件
#include <QPaintEvent>  //绘图事件

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();

    void mousePressEvent(QMouseEvent *event);  //鼠标按下事件
    void mouseMoveEvent(QMouseEvent *event);   //鼠标移动事件
    void mouseReleaseEvent(QMouseEvent *event);  //鼠标松开事件

    void paintEvent(QPaintEvent *event);    //绘图事件

private:
    bool toSave;
    QPoint pStart,pEnd;  //起点和终点
    QPixmap *px;  //缓冲的画布
};

#endif // WIDGET_H

widget.cpp

cpp 复制代码
#include "widget.h"
#include <QPainter>  //画家

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    setFixedSize(800,600);
    px = new QPixmap(this->width(),this->height());  //与主窗口大小一致
    px->fill();   //不填充
}

Widget::~Widget()
{

}

void Widget::mousePressEvent(QMouseEvent *event)
{
    pStart = event->pos();  //起点
}

void Widget::mouseMoveEvent(QMouseEvent *event)
{
    pEnd = event->pos();   //终点
    toSave = false;   //不保存

    //触发绘图事件
    this->update();
}

void Widget::mouseReleaseEvent(QMouseEvent *event)
{
    pEnd = event->pos();   //终点
    toSave = true;    //保存

    this->update();   //触发绘图事件
}

void Widget::paintEvent(QPaintEvent *event)
{
    if(toSave)  //区别移动还是松开
    {
        //当用户松开鼠标,将这根线画到pixmap
        //设定Pixmap作为画布
        QPainter p_pixmap(px);  //两个画家在两个不同的画布上作画
        p_pixmap.drawLine(pStart,pEnd);
    }

    //让Widget成为画布
    QPainter p(this);
    //将之前保留的线画出来
    p.drawPixmap(0,0,*px);
    if(toSave == false)
    {
        //只有鼠标移动的时候,我们才画这根临时的线
       p.drawLine(pStart,pEnd);
    }
}

结果

相关推荐
何曾参静谧3 分钟前
「QT」文件类 之 QTextStream 文本流类
开发语言·qt
liyuanbhu8 分钟前
Halcon HImage 与 Qt QImage 的相互转换(修订版)
qt·计算机视觉·halcon
机器视觉知识推荐、就业指导1 小时前
基于Qt/C++与OpenCV库 实现基于海康相机的图像采集和显示系统(工程源码可联系博主索要)
c++·qt·opencv
机器视觉知识推荐、就业指导1 小时前
使用 Qt 实现基于海康相机的图像采集和显示系统(不使用外部视觉库,如Halcon\OpenCv)[工程源码联系博主索要]
数码相机·qt
Qter_Sean6 小时前
自己动手写Qt Creator插件
开发语言·qt
何曾参静谧6 小时前
「QT」文件类 之 QIODevice 输入输出设备类
开发语言·qt
yyqzjw13 小时前
【qt】控件篇(Enable|geometry)
开发语言·qt
csdn_kike13 小时前
QT Unknown module(s) in QT 以及maintenance tool的更详细用法(qt6.6.0)
开发语言·qt
西西弗Sisyphus13 小时前
Qt 获取当前系统中连接的所有USB设备的信息 lsusb版
qt
kaixin_learn_qt_ing15 小时前
Qt---双缓冲绘图
qt