当前位置: 首页 > news >正文

Qt+线段拖曳示例代码

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_OBJECTpublic: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();
}

http://www.xdnf.cn/news/571969.html

相关文章:

  • 【UE5】环形菜单教程
  • 现代计算机图形学Games101入门笔记(十九)
  • 汽车电子电气架构诊断功能开发全流程解析
  • Linux nbd 网络块设备(2)-内核实现
  • fork 和 写时拷贝
  • NV009NV010美光闪存颗粒NV011NV012
  • 【Elasticsearch】字段别名
  • el-radio-group 与 el-dropdown 一起使用时的注意事项
  • Pytorch基础操作
  • cookie跨域共享踩的坑
  • sqli-labs第十八关——POST-UA注入
  • 使用MATLAB输出1000以内所有完美数
  • MoManipVLA-北京邮电-2025.3.17-移动操控-未完全开源
  • UML 时序图 使用案例
  • PostGIS实现栅格数据导出PNG应用实践【ST_AsPNG 】
  • 乘“4”而上,进取不止|Aloudata 的变与不变
  • 【专四 | 2022年真题】LANGUAGE USAGE逐题总结
  • dedecms织梦全局变量调用方法总结
  • 【OCCT+ImGUI系列】009-Geom2d-Geom2d_AxisPlacement
  • 使用Jenkins部署nodejs前端项目
  • 开源Vue表单设计器FcDesigner中组件联动的配置教程
  • 中国地图上标注颜色的方法
  • 食品饮料行业AI转型趋势分析与智能化解决方案探索​
  • 实战5:个性化数字艺术生成与销售
  • 目标检测 Lite-DETR(2023)详细解读
  • 信息系统项目管理师考前练习3
  • 怎样用 esProc 生成定长时间窗口列表并统计
  • 【Java高阶面经:微服务篇】7. 1秒响应保障:超时控制如何成为高并发系统的“救火队长”?
  • esp32cmini SK6812 2个方式
  • redis--redisJava客户端:Jedis详解