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(pointsi);

// 绘制点

painter.setPen(Qt::NoPen);

painter.setBrush(Qt::red);

painter.drawEllipse(pointsi, 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();

相关推荐
皓悦编程记13 小时前
【YOLO26 系列】基于YOLO26的垃圾分类检测系统【python源码+Pyqt5界面/WEB+数据集+训练代码】
python·qt·分类
十五年专注C++开发19 小时前
qobject_cast转换失败原因分析
c++·qt·dynamic_cast·qobject_cast
sycmancia19 小时前
Qt——线程的生命期问题
开发语言·qt
闻道且行之1 天前
TurboOCR:基于PP-OCRv6的极速Windows离线OCR工具,深度解析3.4GB依赖背后的技术架构
c++·人工智能·python·qt·机器学习·ocr
气概2 天前
QT集成basler相机
开发语言·数码相机·qt
GIS阵地2 天前
QgsRasterDataProvider 完整详解(QGIS 3.40.13 C++)
开发语言·c++·qt·开源软件·qgis
sycmancia3 天前
Qt——多线程中的信号与槽(二)
jvm·qt
Quz3 天前
QML Label 完整用法与 Text 组件选型
前端·qt
kaixin_learn_qt_ing4 天前
QPluginLoader
qt
kaixin_learn_qt_ing4 天前
Qt 提升部件(Promote)找不到头文件路径
qt