Qt 绘制贝塞尔曲线例程


main.cpp

 1 #include <QApplication>  
 2 #include "mywidget.h"  
 3   
 4 int main(int argc, char *argv[])  5 {  6  QApplication a(argc, argv);  7   
 8  MyWidget w;  9     w.resize(300, 300); 10  w.show(); 11   
12     return a.exec(); 13 }  

mywidget.h

 1 #ifndef MYWIDGET_H  2 #define MYWIDGET_H  
 3   
 4 #include <QWidget>  
 5 #include <QLabel>  
 6 #include <QMouseEvent>  
 7 #include <QLabel>  
 8   
 9 class MyWidget : public QWidget 10 { 11  Q_OBJECT 12 public: 13     explicit MyWidget(QWidget *parent = 0); 14   
15     QLabel *startLabel; 16     QLabel *ctrlLabel1; 17     QLabel *ctrlLabel2; 18     QLabel *endLabel; 19   
20     QLabel *ctrlLabel3; 21     QLabel *ctrlLabel4; 22     QLabel *endLabel2; 23   
24     QWidget *selectedWidget; 25   
26 private: 27     void paintEvent(QPaintEvent *event); 28     void mousePressEvent(QMouseEvent *event); 29     void mouseMoveEvent(QMouseEvent *event); 30     void mouseReleaseEvent(QMouseEvent *event); 31   
32 }; 33   
34 #endif // MYWIDGET_H 

mywidget.cpp

 1 #include "mywidget.h"  
 2 #include <QPainter>  
 3 #include <QPainterPath>  
 4 #include <QDebug>  
 5   
 6 MyWidget::MyWidget(QWidget *parent) :  7  QWidget(parent)  8 {  9   
10     startLabel=new QLabel(this); 11     startLabel->resize(10, 10); 12     startLabel->setStyleSheet("QLabel{background-color:red;}"); 13     startLabel->move(100, 110); 14   
15     ctrlLabel1=new QLabel(this); 16     ctrlLabel1->resize(10, 10); 17     ctrlLabel1->setStyleSheet("QLabel{background-color:green;}"); 18     ctrlLabel1->move(120, 120); 19   
20     ctrlLabel2=new QLabel(this); 21     ctrlLabel2->resize(10, 10); 22     ctrlLabel2->setStyleSheet("QLabel{background-color:blue;}"); 23     ctrlLabel2->move(140, 130); 24   
25     endLabel=new QLabel(this); 26     endLabel->resize(10, 10); 27     endLabel->setStyleSheet("QLabel{background-color:black;}"); 28     endLabel->move(160, 140); 29   
30     ctrlLabel3=new QLabel(this); 31     ctrlLabel3->resize(10, 10); 32     ctrlLabel3->setStyleSheet("QLabel{background-color:yellow;}"); 33     ctrlLabel3->move(180, 150); 34   
35     ctrlLabel4=new QLabel(this); 36     ctrlLabel4->resize(10, 10); 37     ctrlLabel4->setStyleSheet("QLabel{background-color:cyan;}"); 38     ctrlLabel4->move(200, 160); 39   
40     endLabel2=new QLabel(this); 41     endLabel2->resize(10, 10); 42     endLabel2->setStyleSheet("QLabel{background-color:#AAAAEE;}"); 43     endLabel2->move(220, 170); 44   
45     selectedWidget=NULL; 46 } 47   
48   
49 void MyWidget::paintEvent(QPaintEvent *event) 50 { 51     QPainter painter(this); 52  painter.setPen(Qt::black); 53     painter.drawLine(startLabel->pos(), ctrlLabel1->pos()); 54     painter.drawLine(ctrlLabel2->pos(), endLabel->pos()); 55     painter.drawLine(endLabel->pos(), ctrlLabel3->pos()); 56     painter.drawLine(ctrlLabel4->pos(), endLabel2->pos()); 57   
58  QPainterPath myPath; 59     myPath.moveTo(startLabel->pos()); 60     myPath.cubicTo(ctrlLabel1->pos(), ctrlLabel2->pos(), endLabel->pos()); 61     myPath.cubicTo(ctrlLabel3->pos(), ctrlLabel4->pos(), endLabel2->pos()); 62  painter.setPen(Qt::red); 63  painter.drawPath(myPath); 64 } 65   
66   
67 void MyWidget::mousePressEvent(QMouseEvent *event) 68 { 69     QWidget *w=this->childAt(event->pos()); 70     if(w==NULL) return; 71     if(w->inherits("QLabel")){ 72         selectedWidget=w; 73  } 74 } 75   
76 void MyWidget::mouseReleaseEvent(QMouseEvent *event) 77 { 78     selectedWidget=NULL; 79 } 80   
81 void MyWidget::mouseMoveEvent(QMouseEvent *event) 82 { 83     if(selectedWidget!=NULL){ 84         selectedWidget->move(event->pos()); 85         this->update(); 86  } 87 }  


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM