Qt+线段拖曳示例代码

Qt线段拖曳示例代码,功能见下图。

Qt+线段拖曳示例代码_第1张图片

代码如下:

canvaswidget.h

#ifndef CANVASWIDGET_H
#define CANVASWIDGET_H

#include 
#include 
#include 
#include 

class CanvasWidget : public QWidget
{
    Q_OBJECT
public:
    explicit CanvasWidget(QWidget *parent = nullptr);

protected:
    void paintEvent(QPaintEvent* event)override;
    void mousePressEvent(QMouseEvent* event)override;
    void mouseMoveEvent(QMouseEvent* event)override;
    void mouseReleaseEvent(QMouseEvent* event)override;
private:
    bool isPointValid(QPoint point)const;
    QPoint constrainPoint(QPoint point)const;
signals:
private:
    QVector points;
    int selectedPointIndex = -1;
};

#endif // CANVASWIDGET_H

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 

class CanvasWidget;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    CanvasWidget* canvas;
};
#endif // MAINWINDOW_H

canvas.widget.cpp

#include "canvaswidget.h"
#include 
#include 

CanvasWidget::CanvasWidget(QWidget *parent)
    : QWidget{parent}
{
    points << QPoint(50,50)<button() == Qt::RightButton)
    {
        points << QPoint(event->pos());
        update();
    }
    else if(event->button() == Qt::LeftButton)
    {
        for(int i=0; ipos() - point).manhattanLength()<15)
            {
                selectedPointIndex = i;
                break;
            }
        }
    }

}

void CanvasWidget::mouseMoveEvent(QMouseEvent *event)
{
    if(selectedPointIndex != -1)
    {
        points[selectedPointIndex] = constrainPoint(event->pos());
        update();
    }
}

void CanvasWidget::mouseReleaseEvent(QMouseEvent *event)
{
    Q_UNUSED(event);
    selectedPointIndex = -1;
    qDebug() << "pos:" << event->pos();
}

bool CanvasWidget::isPointValid(QPoint p) const
{
    return p.x()>=0 && p.y() >=0 && p.x()

mainwindow.cpp

#include "mainwindow.h"
#include "canvaswidget.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{

    setFixedSize(600, 400);
    setStyleSheet("background-color:#ffffff;");
    setWindowTitle("drag_line");
    canvas = new CanvasWidget(this);
    canvas->setGeometry(50, 50, 500, 300);
}

MainWindow::~MainWindow()
{

}

main.cpp

#include "mainwindow.h"

#include 

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

你可能感兴趣的:(qt,开发语言,c++)