《QT实用小工具·二十八》基于qt开发的各种曲线

1、概述
源码放在文章末尾

该项目实现了各种曲线的绘制,下面是项目的demo演示:
在这里插入图片描述
项目部分代码如下:

#include "frmsmoothcurve.h"
#include "ui_frmsmoothcurve.h"
#include "smoothcurve.h"
#include "qpainter.h"
#include "qdatetime.h"
#include "qdebug.h"

#define TIMEMS QTime::currentTime().toString("hh:mm:ss zzz")

frmSmoothCurve::frmSmoothCurve(QWidget *parent) : QWidget(parent), ui(new Ui::frmSmoothCurve)
{
    ui->setupUi(this);

    //初始化随机数种子
    srand(QDateTime::currentDateTime().toMSecsSinceEpoch());

    //随机生成曲线上的点
    int x = -300;
    while (x < 300) {
        datas << QPointF(x, rand() % 300 - 100);
        x += qMin(rand() % 30 + 5, 300);
    }

    //正常曲线
    pathNormal.moveTo(datas.at(0));
    for (int i = 1; i < datas.size(); ++i) {
        pathNormal.lineTo(datas.at(i));
    }

    //平滑曲线1
    //qDebug() << TIMEMS << "createSmoothCurve start";
    pathSmooth1 = SmoothCurve::createSmoothCurve(datas);
    //qDebug() << TIMEMS << "createSmoothCurve stop";

    //平滑曲线2
    //qDebug() << TIMEMS << "createSmoothCurve2 start";
    pathSmooth2 = SmoothCurve::createSmoothCurve2(datas);
    //qDebug() << TIMEMS << "createSmoothCurve2 stop";

    ui->ckShowPoint->setChecked(true);
    connect(ui->ckShowPoint, SIGNAL(clicked(bool)), this, SLOT(update()));
    connect(ui->rbtnPathNormal, SIGNAL(clicked(bool)), this, SLOT(update()));
    connect(ui->rbtnPathSmooth1, SIGNAL(clicked(bool)), this, SLOT(update()));
    connect(ui->rbtnPathSmooth2, SIGNAL(clicked(bool)), this, SLOT(update()));
}

frmSmoothCurve::~frmSmoothCurve()
{
    delete ui;
}

void frmSmoothCurve::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.translate(width() / 2, height() / 2);
    painter.scale(1, -1);

    //画坐标轴
    painter.setPen(QColor(180, 180, 180));
    painter.drawLine(-250, 0, 250, 0);
    painter.drawLine(0, 150, 0, -150);

    //根据选择绘制不同的曲线路径
    painter.setPen(QPen(QColor(80, 80, 80), 2));
    if (ui->rbtnPathSmooth1->isChecked()) {
        painter.drawPath(pathSmooth1);
    } else if (ui->rbtnPathSmooth2->isChecked()) {
        painter.drawPath(pathSmooth2);
    } else {
        painter.drawPath(pathNormal);
    }

    //如果曲线上的点可见则显示出来
    if (ui->ckShowPoint->isChecked()) {
        painter.setPen(Qt::black);
        painter.setBrush(Qt::gray);
        foreach (QPointF point, datas) {
            painter.drawEllipse(point, 3, 3);
        }
    }
}

源码下载

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-21 01:16:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-21 01:16:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-21 01:16:02       82 阅读
  4. Python语言-面向对象

    2024-04-21 01:16:02       91 阅读

热门阅读

  1. 数据库1~4NF+ BCNF

    2024-04-21 01:16:02       36 阅读
  2. Hive中array,map,struct三种数据结构说明

    2024-04-21 01:16:02       33 阅读
  3. 第3章 数据

    2024-04-21 01:16:02       39 阅读
  4. PCL 基于马氏距离KMeans点云聚类

    2024-04-21 01:16:02       36 阅读
  5. MongoDB【四】查询与聚合框架

    2024-04-21 01:16:02       32 阅读
  6. vite与webpack有什么不同?为什么vite比webpack快?

    2024-04-21 01:16:02       39 阅读
  7. Webpack打包

    2024-04-21 01:16:02       34 阅读
  8. Leetcode5--最长回文子串(双指针中心扩散法)

    2024-04-21 01:16:02       31 阅读
  9. 单片机小项目——直流电机+按键

    2024-04-21 01:16:02       32 阅读
  10. go 基本知识点备忘

    2024-04-21 01:16:02       37 阅读
  11. JVM调优

    2024-04-21 01:16:02       31 阅读
  12. MYSQL之事务

    2024-04-21 01:16:02       33 阅读