main.cpp
- #include <QApplication>
- #include "mywidget.h"
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- MyWidget w;
- w.resize(300, 300);
- w.show();
- return a.exec();
- }
mywidget.h
- #ifndef MYWIDGET_H
- #define MYWIDGET_H
- #include <QWidget>
- #include <QLabel>
- #include <QMouseEvent>
- #include <QLabel>
- class MyWidget : public QWidget
- {
- Q_OBJECT
- public:
- explicit MyWidget(QWidget *parent = 0);
- QLabel *startLabel;
- QLabel *ctrlLabel1;
- QLabel *ctrlLabel2;
- QLabel *endLabel;
- QLabel *ctrlLabel3;
- QLabel *ctrlLabel4;
- QLabel *endLabel2;
- QWidget *selectedWidget;
- private:
- void paintEvent(QPaintEvent *event);
- void mousePressEvent(QMouseEvent *event);
- void mouseMoveEvent(QMouseEvent *event);
- void mouseReleaseEvent(QMouseEvent *event);
- };
- #endif // MYWIDGET_H
- #include "mywidget.h"
- #include <QPainter>
- #include <QPainterPath>
- #include <QDebug>
- MyWidget::MyWidget(QWidget *parent) :
- QWidget(parent)
- {
- startLabel=new QLabel(this);
- startLabel->resize(10, 10);
- startLabel->setStyleSheet("QLabel{background-color:red;}");
- startLabel->move(100, 110);
- ctrlLabel1=new QLabel(this);
- ctrlLabel1->resize(10, 10);
- ctrlLabel1->setStyleSheet("QLabel{background-color:green;}");
- ctrlLabel1->move(120, 120);
- ctrlLabel2=new QLabel(this);
- ctrlLabel2->resize(10, 10);
- ctrlLabel2->setStyleSheet("QLabel{background-color:blue;}");
- ctrlLabel2->move(140, 130);
- endLabel=new QLabel(this);
- endLabel->resize(10, 10);
- endLabel->setStyleSheet("QLabel{background-color:black;}");
- endLabel->move(160, 140);
- ctrlLabel3=new QLabel(this);
- ctrlLabel3->resize(10, 10);
- ctrlLabel3->setStyleSheet("QLabel{background-color:yellow;}");
- ctrlLabel3->move(180, 150);
- ctrlLabel4=new QLabel(this);
- ctrlLabel4->resize(10, 10);
- ctrlLabel4->setStyleSheet("QLabel{background-color:cyan;}");
- ctrlLabel4->move(200, 160);
- endLabel2=new QLabel(this);
- endLabel2->resize(10, 10);
- endLabel2->setStyleSheet("QLabel{background-color:#AAAAEE;}");
- endLabel2->move(220, 170);
- selectedWidget=NULL;
- }
- void MyWidget::paintEvent(QPaintEvent *event)
- {
- QPainter painter(this);
- painter.setPen(Qt::black);
- painter.drawLine(startLabel->pos(), ctrlLabel1->pos());
- painter.drawLine(ctrlLabel2->pos(), endLabel->pos());
- painter.drawLine(endLabel->pos(), ctrlLabel3->pos());
- painter.drawLine(ctrlLabel4->pos(), endLabel2->pos());
- QPainterPath myPath;
- myPath.moveTo(startLabel->pos());
- myPath.cubicTo(ctrlLabel1->pos(), ctrlLabel2->pos(), endLabel->pos());
- myPath.cubicTo(ctrlLabel3->pos(), ctrlLabel4->pos(), endLabel2->pos());
- painter.setPen(Qt::red);
- painter.drawPath(myPath);
- }
- void MyWidget::mousePressEvent(QMouseEvent *event)
- {
- QWidget *w=this->childAt(event->pos());
- if(w==NULL) return;
- if(w->inherits("QLabel")){
- selectedWidget=w;
- }
- }
- void MyWidget::mouseReleaseEvent(QMouseEvent *event)
- {
- selectedWidget=NULL;
- }
- void MyWidget::mouseMoveEvent(QMouseEvent *event)
- {
- if(selectedWidget!=NULL){
- selectedWidget->move(event->pos());
- this->update();
- }
- }
运行效果:
网址:http://blog.youkuaiyun.com/zgrjkflmkyc/article/details/45934829