QPainter☞之 鼠标绘图

14 篇文章 0 订阅

QPainter鼠标绘图要点

1.使用drawPoint()函数

2.记录上一次(鼠标)画的点的位置。

上代码:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include<QPainter>
#include<QMouseEvent>


namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    //绘图事件
    void paintEvent(QPaintEvent *event);
    
    //鼠标按下事件
    void mousePressEvent(QMouseEvent *event);
    //鼠标按下移动事件
    void mouseMoveEvent(QMouseEvent *event);
    //鼠标释放事件
    void mouseReleaseEvent(QMouseEvent *event);
    

private:
    Ui::MainWindow *ui;
    bool press;
    QPoint point;
    QList<QPoint> point_list;
    
    QPoint lastPoint;
    QPoint endPoint;
    QPainter *painter=NULL;

};

#endif // MAINWINDOW_H

cpp文件:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setMouseTracking(true);
    this->press = false;

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::paintEvent(QPaintEvent *event)
{
    if(painter==NULL)
        painter = new QPainter();
    painter->begin(this);
    painter->save();
    QPen pen;
    pen.setWidth(5);
    painter->setRenderHint(QPainter::Antialiasing);
    pen.setColor(Qt::red);
    pen.setStyle(Qt::SolidLine);
    painter->setPen(pen);

    int i=0;
    while(point_list.size()!=0&&i!=point_list.size())
    {
        painter->drawPoint(point_list.at(i));
        i++;
    }
    painter->restore();
    painter->end();
/*画箭头
    QPainter painter(this);
    const int length = 10;//箭头斜着的投影到线上的长度
    QVector<QLineF> lines;
    lines.append(QLineF(0.0,height()/2,width()/2,height()/2));
    lines.append(QLineF(width()/2-length,height()/2+length,width()/2,height()/2));
    lines.append(QLineF(width()/2-length,height()/2-length,width()/2,height()/2));
    painter.drawLines(lines);*/

}


//开始记录坐标
void MainWindow::mousePressEvent(QMouseEvent *event)
{
    if(event->button()==Qt::LeftButton)
    {
        lastPoint = event->pos();
        this->press =  true;
    }
}
//鼠标移动事件
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    if(event->buttons()&Qt::LeftButton)
    {
        if(this->press)     //只有鼠标被按下的时候才记录坐标
        {
            point = event->pos();       //记录坐标
            point_list.append(point);   //记录每一次移动的坐标
            update();       //更新
        }
        update();//拖动时有痕迹
    }
}
//鼠标松开 停止记录
void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton)
    {
        endPoint = event->pos();
        update();
    }
}


 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fyzy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值