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

相关推荐
qq_401700417 小时前
Qt 中文乱码的根源:QString::fromLocal8Bit 和 fromUtf8 区别在哪?
开发语言·qt
机器视觉知识推荐、就业指导10 小时前
Qt 和 C++,是不是应该叫 Q++ 了?
开发语言·c++·qt
liu****11 小时前
三.Qt图形界面开发完全指南:从入门到掌握常用控件
开发语言·c++·qt
离离茶15 小时前
【笔记1-11】Qt 关闭QToolbar的拓展菜单
开发语言·笔记·qt
一只小bit17 小时前
Qt 绘图核心教程:从基础绘制到图像操作全解析
前端·c++·qt·gui
四维碎片17 小时前
【Qt】代理(Delegate)的使用
开发语言·qt
从此不归路18 小时前
Qt5 进阶【9】模型-视图框架实战:从 TableView 到自定义模型的一整套落地方案
开发语言·c++·qt
wjhx19 小时前
在Qt Design Studio中进行页面切换
前端·javascript·qt
HL_风神19 小时前
QT事件循环机制源码学习
开发语言·qt·学习
牵牛老人19 小时前
【Qt上位机与下位机交互数据组装与解析:全类型数据转换实战指南】
开发语言·qt·交互