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