Qt之任意画线
时间: 2018-09-07来源:OSCHINA
前景提要
「深度学习福利」大神带你进阶工程师,立即查看>>>
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)); } } }

科技资讯:

科技学院:

科技百科:

科技书籍:

网站大全:

软件大全:

热门排行