qt绘制曲线

#pragma once

#include <QWidget>

#include <QPainter>

#include <QPainterPath>

#include <QMouseEvent>

#include <QVector>

class CurveWidget : public QWidget {

Q_OBJECT

public:

CurveWidget(QWidget* parent = nullptr) : QWidget(parent), lastPoint(QPointF()) {}

protected:

void mousePressEvent(QMouseEvent* event) override {

if (event->button() == Qt::LeftButton) {

lastPoint = event->pos();

points.clear();

points.append(lastPoint);

update();

}

}

void mouseMoveEvent(QMouseEvent* event) override {

if (event->buttons() & Qt::LeftButton) {

QPointF newPoint = event->pos();

if ((newPoint - lastPoint).manhattanLength() > 0) { // 避免绘制过于密集的点

points.append(newPoint);

lastPoint = newPoint;

update();

}

}

}

void paintEvent(QPaintEvent* event) override {

QPainter painter(this);

painter.setRenderHint(QPainter::Antialiasing);

QPainterPath path;

if (!points.isEmpty()) {

path.moveTo(points.first());

for (int i = 1; i < points.size(); ++i) {

// 这里我们仍然使用lineTo来连接点,但为了视觉效果,你可以在最终渲染时应用平滑算法

path.lineTo(points[i]);

// 绘制点

painter.setPen(Qt::NoPen);

painter.setBrush(Qt::red);

painter.drawEllipse(points[i], 3, 3); // 绘制以点为中心,半径为3的小圆

}

// 如果需要绘制平滑曲线,这里应该使用cubicTo或quadTo,并计算控制点

painter.setPen(QPen(Qt::blue, 2));

painter.setBrush(Qt::transparent);

painter.drawPath(path);

}

}

private:

QVector<QPointF> points;

QPointF lastPoint;

};

// 使用方法同前

// CurveWidget *widget = new CurveWidget();

// widget->show();

相关推荐
Mr.Q2 小时前
OpenCV和Qt坐标系不一致问题
qt·opencv
重生之我是数学王子5 小时前
QT基础 编码问题 定时器 事件 绘图事件 keyPressEvent QT5.12.3环境 C++实现
开发语言·c++·qt
----云烟----14 小时前
QT中QString类的各种使用
开发语言·qt
「QT(C++)开发工程师」20 小时前
【qt版本概述】
开发语言·qt
一路冰雨1 天前
Qt打开文件对话框选择文件之后弹出两次
开发语言·qt
老赵的博客1 天前
QT 自定义界面布局要诀
开发语言·qt
码码哈哈0.01 天前
VSCode 2022 离线安装插件QT VSTOOl报错此扩展不能安装在任何当前安装的产品上。
ide·vscode·qt
feiyangqingyun1 天前
Qt/C++离线地图的加载和交互/可以离线使用/百度和天地图离线/支持手机上运行
c++·qt·qt天地图·qt离线地图·qt地图导航
gz94562 天前
windows下,用CMake编译qt项目,出现错误By not providing “FindQt5.cmake“...
开发语言·qt
「QT(C++)开发工程师」2 天前
Ubuntu 26.04 LTS 大升级:Qt 6 成为未来新引擎
qt