widget.h數組
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QPushButton> #include <QMouseEvent> #include <QPainter> #include <QVector> class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = 0); ~Widget(); private: void mousePressEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); void paintEvent(QPaintEvent *event); QVector<QVector<QPoint>>_lines; }; #endif // WIDGET_H
widget.cpp安全
//當鼠標按下時: 建立一條新線壓入vector。而且將當前鼠標位置做爲新線的起點。 void Widget::mousePressEvent(QMouseEvent *event){ QVector<QPoint>line; _lines.append(line); QVector<QPoint>&last_line = _lines.last(); //注意:引用而不是新建,不然不是同一個內存 last_line.append(event->pos()); update(); //注意必定要記得update } //若是鼠標正在移動:將這些移動的點都壓入最上面也就是最新的線 #include <QDebug> void Widget::mouseMoveEvent(QMouseEvent *event){ // qDebug() << "mouseMoveEvent"; if(!_lines.size()){ //保證安全 QVector<QPoint>line; _lines.append(line); } QVector<QPoint>&last_line = _lines.last(); last_line.append(event->pos()); update(); //注意必定要記得update } //若是鼠標鬆開,這個點就是新線的終點,只須要把此時的點壓入最新線就能夠了 void Widget::mouseReleaseEvent(QMouseEvent *event){ QVector<QPoint>&last_line = _lines.last(); last_line.append(event->pos()); update(); //注意必定要記得update } //在鼠標事件中記錄線的軌跡,在繪畫事件中繪製軌跡 void Widget::paintEvent(QPaintEvent *event){ //建立畫筆 // QPainter painter(this); //vector數組中有幾條線 // for(int i = 0; i < _lines.size(); ++i){ //一條條繪製 // QVector<QPoint>line = _lines.at(i); // for(int j = 0; j < line.size(); ++j){ // QPoint tj = line.at(j); // painter.drawPoint(tj); //不要畫點,畫線有專門的函數 // } // } QPainter p(this); for(int i=0; i<_lines.size(); ++i) { const QVector<QPoint>& line = _lines.at(i); for(int j=0; j<line.size()-1; ++j) { p.drawLine(line.at(j), line.at(j+1)); } } }