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

相关文章
相关标签/搜索