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 }  

Qt 绘制贝塞尔曲线例程

Qt 绘制贝塞尔曲线例程

上一篇:Vue如何让router-view默认显示页面


下一篇:Tensorflow之Slim使用