头文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QVector>
#include <QPoint>
#include <QPaintEvent>
#include <QMouseEvent>
#include <QKeyEvent>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
void paintEvent(QPaintEvent *event);
void mousePressEvent(QMouseEvent *event); //鼠标按下
void mouseMoveEvent(QMouseEvent *event); //鼠标移动
void keyPressEvent(QKeyEvent *event); //键盘按下
private:
Ui::Widget *ui;
QVector< QVector<QPoint> > lines; // 所有线的集合
};
#endif // WIDGET_H
外部实现
#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::paintEvent(QPaintEvent *event)
{
QPainter p(this);
// 取出所有的线
for (int i = 0; i < lines.size(); i++)
{
// 第 i 条线
const QVector<QPoint> &line = lines.at(i);
// 每一条线中所有的点,两两连起来,就是一条线
for (int j = 0; j < line.size()-1; j++)
{
p.drawLine(line[j], line[j+1]);
}
}
}
void Widget::mousePressEvent(QMouseEvent *e)
{
// 每一次鼠标按下,表明有一条新的线产生
QVector<QPoint> line;
// 将按下的那个点,也就是线的起始点,加入到线中
line.push_back(e->pos());
// 将新产生的线放到线的集合中
lines.push_back(line);
}
void Widget::mouseMoveEvent(QMouseEvent *e)
{
// 将移动过程中产生的点,加入到容器中的最后一条线中
QVector<QPoint> &line = lines.last();
line.push_back(e->pos());
// 手动触发 paintevent事件,调用 update函数
update();
}
void Widget::keyPressEvent(QKeyEvent *e)
{
// 撤销上一次画的线
if (e->modifiers() == Qt::ControlModifier && e->key() == 'Z') ///ctrl+Z取消上一次画的线
{
if (!lines.empty())
{
lines.removeLast();
update();
}
}
}