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);
    }
}

结果

相关推荐
用户805533698032 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner2 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz7 天前
QML Hello World 入门示例
qt
xcyxiner10 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner10 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner11 天前
DicomViewer (添加模型类)3
qt
xcyxiner11 天前
DicomViewer (目录调整) 2
qt
xcyxiner11 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
桥田智能13 天前
桥田智能 QT-650S:面向白车身焊装的 800kg 重载快换解决方案
开发语言·qt·系统架构
森G13 天前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt