qt实现简易的画图,鼠标事件

原理就是通过mousemove获取鼠标实时位置,存储到列表中,调用paintevent进行绘制即可。
看代码:
.h

#ifndef WIDGET_H
#define WIDGET_H

#include 
#include 
#include 

struct myPoint
{
    QPoint point;
    QPoint movePoint;

    int m_r;
    int m_g;
    int m_b;
};

class Widget : public QWidget
{
    Q_OBJECT

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

    void CreateMenu();

protected:
    void paintEvent(QPaintEvent *event);
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);

public slots:
    void onDeleteClicked();
    void onColorClicked();

private:
    bool m_bCliked=false;
    QPoint m_Point;
    QPoint m_movePoint;

    QMenu *m_pMenu=nullptr;

    QFont m_Font;

    QList<myPoint> pointList;

    int m_R=255;
    int m_G=0;
    int m_B=0;

};
#endif // WIDGET_H

.cpp

#include "widget.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include 

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    this->resize(800,600);

    CreateMenu();

    m_Font.setPointSize(5);
    m_Font.setFamily("Microsoft YaHei");
}

Widget::~Widget()
{
}

void Widget::CreateMenu()
{
    m_pMenu=new QMenu(this);
    QAction *clearAction=new QAction(tr("Clear"),this);
    QAction *colorAction=new QAction(tr("Color"),this);
    m_pMenu->addAction(colorAction);
    m_pMenu->addSeparator();
    m_pMenu->addAction(clearAction);
    connect(clearAction,&QAction::triggered,this,&Widget::onDeleteClicked);
    connect(colorAction,&QAction::triggered,this,&Widget::onColorClicked);
}

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);

    painter.setFont(m_Font);
    for(int i=0;i<pointList.size();i++)
    {
        myPoint mypoint=pointList[i];
        QPen pen(QBrush(QColor(mypoint.m_r,mypoint.m_g,mypoint.m_b)),5);
        painter.setPen(pen);
        painter.drawLine(mypoint.point.x(),mypoint.point.y(),mypoint.movePoint.x(),mypoint.movePoint.y());
    }
}

void Widget::mousePressEvent(QMouseEvent *event)
{
    if(event->buttons()==Qt::LeftButton)
    {
        m_bCliked=true;
        m_Point=event->pos();
    }
}

void Widget::mouseMoveEvent(QMouseEvent *event)
{
    if(event->buttons()==Qt::LeftButton&&m_bCliked)
    {
        m_movePoint=event->pos();
        m_Point=event->pos();

        myPoint mypoint;
        mypoint.point=m_Point;
        mypoint.movePoint=m_movePoint;
        mypoint.m_r=m_R;
        mypoint.m_g=m_G;
        mypoint.m_b=m_B;

        pointList.append(mypoint);
    }
    update();
}

void Widget::mouseReleaseEvent(QMouseEvent *event)
{
    m_bCliked=false;

    if(event->button()==Qt::RightButton)
    {
        m_pMenu->move(mapToGlobal(event->pos()));
        m_pMenu->show();
    }

}

void Widget::onDeleteClicked()
{
    pointList.clear();
    update();
}

void Widget::onColorClicked()
{
    QColor color = QColorDialog::getColor(QColor(255,0,0));

    m_R=color.red();
    m_G=color.green();
    m_B=color.blue();
}

效果图:
qt实现简易的画图,鼠标事件_第1张图片
都1202年,你还相信光吗?欢迎评论区告诉我。
ヾ( ̄▽ ̄)ByeBye

你可能感兴趣的:(Qt,qt,paint)