Qt之任意畫線

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

相關文章
相關標籤/搜索