ingenious |
2015-11-07 22:21 |
Qt5实现类似cad画图功能
[attachment=14496][attachment=14497][attachment=14498]包含三个文件Draw.pro MyWidget .h MyWidget.cpp Draw.pro: QT += core widgets gui HEADERS += \ MyWidget.h SOURCES += \ MyWidget.cpp MyWidget .h : #ifndef MYWIDGET_H#define MYWIDGET_H #include <QWidget> typedef struct MyLine{ QPoint startPnt; QPoint endPnt;}myLine; class MyWidget : public QWidget{ Q_OBJECTpublic: explicit MyWidget(QWidget *parent = 0); void paintEvent(QPaintEvent *); void mouseMoveEvent(QMouseEvent *); void mousePressEvent(QMouseEvent *); void mouseReleaseEvent(QMouseEvent *); signals: public slots: public: //QVector< QVector<QPoint> > lines; QPoint startPnt; QPoint endPnt; QVector<myLine*> lines; bool isPressed; }; #endif // MYWIDGET_H MyWidget.cpp #include "MyWidget.h"#include <QPainter>#include <QPixmap>#include <QMouseEvent>#include <QDebug> MyWidget::MyWidget(QWidget *parent) : QWidget(parent){ } void MyWidget::paintEvent(QPaintEvent *) //执行过程painting-pressed-moved-painting-released{ QPainter painter(this); if(startPnt != endPnt) painter.drawLine(startPnt, endPnt); for(int i = 0;i<lines.size();i++) { //重绘时需要画出所有线 myLine* pLine = lines; painter.drawLine(pLine->startPnt,pLine->endPnt); }} void MyWidget::mouseMoveEvent(QMouseEvent *ev){ if(isPressed==false)//鼠标移动,但是鼠标是松开的 { endPnt = ev->pos(); update(); qDebug()<<ev->pos(); } else { setMouseTracking(false); }}void MyWidget::mousePressEvent(QMouseEvent *ev){ isPressed=true; if (hasMouseTracking()) { myLine* line = new myLine; line->startPnt = startPnt; line->endPnt = endPnt; this->lines.push_back(line); setMouseTracking(false); } else { startPnt = endPnt = ev->pos(); setMouseTracking(true);//默认情况下mouse tracking是false的,由于左键被按下之后,被设为了true,所以在上面要被设为false update(); }} void MyWidget::mouseReleaseEvent(QMouseEvent *ev){ isPressed = false; update(); qDebug()<<lines.size();} #include <QApplication>int main(int argc, char** argv){ QApplication app(argc, argv); MyWidget w; w.show(); return app.exec();} 上面的代码,实现了鼠标点击两点画直线,但我想对上面实现改进: 如何才能实现画多条折线,每画完一条折线后,用滚轮键结束命令,总之一句话就是类似于cad画直线的操作,最好也要像cad一样,弹出一个LineEdit,在里面输入点的位置画直线。希望各路大神,积极发表意见,感激不尽,这样每个人都能学到知识!
|
|