在窗体设备上绘制图像使用QPainter类,在paintevent函数中进行绘制
方法一:使用容器储存鼠标移动的点,并且绘制出来
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QMouseEvent>
#include <QPaintEvent>
#include <QPainter>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
void mousePressEvent(QMouseEvent *e);//鼠标按下事件
void mouseMoveEvent(QMouseEvent *e);//鼠标移动事件
void mouseReleaseEvent(QMouseEvent *e);//鼠标抬起事件
void paintEvent(QPaintEvent *e);//绘图事件
QVector<QPoint> vpoint;
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
源文件
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::mousePressEvent(QMouseEvent *e){
vpoint.push_back( e->pos());
}
void MainWindow::mouseMoveEvent(QMouseEvent *e){
vpoint.push_back( e->pos());//将路径点加入容器
repaint();//强制窗体更新显示绘制点
}
void MainWindow::mouseReleaseEvent(QMouseEvent *e){
QVector<QPoint>().swap(vpoint);//清空容器下次重新绘制线
}
void MainWindow::paintEvent(QPaintEvent *e){
QPainter painter(this);
//绘制线段
for (int i = 0;i<vpoint.size()-1;i++){
painter.drawLine(vpoint[i],vpoint[i+1]);
}
}
由于是直接在窗体上绘图,只能绘制一条曲线,下一次绘制后窗体更新,旧线就消失了

方法二:在qpixmap上绘制线,并显示在窗体中
在鼠标事件函数中,使用e->globalPos函数和mapFromGlobal函数,可以获取全局坐标并将全局坐标转换成控件内相对坐标,进而在控件上绘制
设置一个起始点startpoint和一个终点endpoint,在每次鼠标移动时,实时更新两个点的位置并绘制线段。
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QMouseEvent>
#include <QPaintEvent>
#include <QPainter>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
void mousePressEvent(QMouseEvent *e);//鼠标按下事件
void mouseMoveEvent(QMouseEvent *e);//鼠标移动事件
void mouseReleaseEvent(QMouseEvent *e);//鼠标抬起事件
void paintEvent(QPaintEvent *e);//绘图事件
QPixmap *myPix;//画布
QPoint startPoint,endPoint;//起始和结束点
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
源文件
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
myPix = new QPixmap(ui->label->size());//将自定义的绘制版大小设置为画板大小
myPix->fill(Qt::white);//填充颜色白色
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::mousePressEvent(QMouseEvent *e){
startPoint = endPoint = ui->label->mapFromGlobal( e->globalPos());
}
void MainWindow::mouseMoveEvent(QMouseEvent *e){
startPoint = endPoint;
endPoint = ui->label->mapFromGlobal( e->globalPos());
}
void MainWindow::mouseReleaseEvent(QMouseEvent *e){
}
void MainWindow::paintEvent(QPaintEvent *e){
QPainter painter(myPix);
painter.drawLine(startPoint,endPoint);
ui->label->setPixmap(*myPix);
}
