Qt线段拖曳示例代码,功能见下图。
代码如下:
canvaswidget.h
#ifndef CANVASWIDGET_H
#define CANVASWIDGET_H
#include <QWidget>
#include <QPainter>
#include <QMouseEvent>
#include <QVector>
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<QPoint> points;
int selectedPointIndex = -1;
};
#endif // CANVASWIDGET_H
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
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 <QLinearGradient>
#include <QDebug>
CanvasWidget::CanvasWidget(QWidget *parent)
: QWidget{parent}
{
points << QPoint(50,50)<<QPoint(200,200);
setMouseTracking(true);
setStyleSheet("background-color:#e6f7ff;");
}
void CanvasWidget::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
QLinearGradient gradient(0, 0, width(), height());
gradient.setColorAt(0, QColor(230, 247, 255));
gradient.setColorAt(1, QColor(210, 235, 255));
painter.fillRect(rect(), gradient);
QPen linePen(QColor(75,175,240), 3, Qt::SolidLine,
Qt::RoundCap, Qt::RoundJoin);
// painter.drawLines(points);
for(int i=1, c=points.size(); i<c; i++)
{
painter.drawLine(points[i-1], points[i]);
}
QBrush pointBrush(QColor(255, 153, 153));
painter.setBrush(pointBrush);
for(const auto& point: points)
{
painter.drawEllipse(point, 7, 7);
}
}
void CanvasWidget::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::RightButton)
{
points << QPoint(event->pos());
update();
}
else if(event->button() == Qt::LeftButton)
{
for(int i=0; i<points.size(); i++)
{
const auto& point = points[i];
if((event->pos() - 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()<width() && p.y()<height();
}
QPoint CanvasWidget::constrainPoint(QPoint p) const
{
int x = p.x(), y = p.y();
x = fmin(x, width());
x = fmax(x, 0);
y = fmin(y, height());
y = fmax(y, 0);
return QPoint(x, y);
}
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 <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}