qt 自定义窗口绘制正弦曲线

Posted fuhang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了qt 自定义窗口绘制正弦曲线相关的知识,希望对你有一定的参考价值。

circlewidget.h

#ifndef CIRCLAWIDGET_H
#define CIRCLAWIDGET_H
#include <QFrame>
#include<QVector>
#include<QMouseEvent>

class CircleWidget:public QFrame
{
    Q_OBJECT
public:
    CircleWidget(QWidget *parent);
    ~CircleWidget();
private:
    void paintEvent(QPaintEvent *event);


public:
    void Adjust(int period, int grain, int radius);
    QPoint origin();            // 坐标原点位置
    QPoint toCoord(QPoint p);   // 将GUI窗口的点(x,y)转换成坐标系统里的点
    QPoint fromCoord(QPoint p); // 将坐标系内的(x,y)转成GUI的坐标
private:

    int m_period, m_grain, m_radius;

};

#endif // CIRCLAWIDGET_H

circlewidget.cpp

# include"circlewidget.h"
#include<QPainter>
#include<QDebug>
#include<math.h>

CircleWidget::CircleWidget(QWidget *parent):QFrame(parent)
{
        m_period = 20;  //周期
        m_grain = 1;    //粒度
        m_radius = 10; // 振幅
}
CircleWidget::~CircleWidget()
{

}
void CircleWidget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);

        int width = this->width();
        int height = this->height();
        QRect rect(0,0, width, height);

        // 设置背景为黑色
        painter.setBrush(QBrush(QColor(0x00,0x00, 0x00)));
        painter.drawRect(rect);

        painter.setPen(QPen(QColor(0, 255, 0))); // 设置线条为绿色

        QPoint o = origin();
        painter.drawLine(QPoint(0, o.y()), QPoint(width, o.y())); // x轴
        painter.drawLine(QPoint(o.x(), 0), QPoint(o.x(), height));// y轴


        // 正弦曲线: 从坐标原点,向左、向右伸展
        QPoint p1(0,0);
        for(int x=0; x<width/2; x+=m_grain)
        {
            // y=sin(x)
            double angle = (double) x / m_period * 2 * 3.1415926;
            double y = m_radius * sin(angle);
            QPoint p2(x, y);

            // 右侧
            painter.drawLine(fromCoord(p1), fromCoord(p2));

            // 左侧
            QPoint base(0,0);
            painter.drawLine(fromCoord(base-p1), fromCoord(base-p2));

            p1 = p2;
        }

}

void CircleWidget::Adjust(int period, int grain, int radius)
{
    m_period = period;
    m_grain = grain;
    m_radius = radius;
    update(); // 更新重绘
}

QPoint CircleWidget::origin()
{
    QRect r = this->rect();
    return r.center();
}
// 将GUI窗口的点(x,y)转换成数学坐标系统里的点
QPoint CircleWidget::toCoord(QPoint p)
{
    // 圆心
    QPoint o = this->origin();
    QPoint result =  p - o;
    result.setY(0 - result.y()); // y坐标反转
    return result;
}
// 将数学坐标系内的(x,y)转成GUI的坐标
QPoint CircleWidget::fromCoord(QPoint p)
{
    // 圆心
    QPoint o = this->origin();
    p.setY(0 - p.y()); // y坐标反转
    return p + o;

}

结果:

技术分享图片

以上是关于qt 自定义窗口绘制正弦曲线的主要内容,如果未能解决你的问题,请参考以下文章

Qt学习笔记11.自定义控件 Customize the Widget

QT绘制B样条曲线

在 PyQt 中更新 Qt 场景图

C# WinForm自定义进度条

matlab 怎么循环plot自定义颜色?

C# wpf 如何实现自定义控件,布局时,大小发生变化,内部绘制的曲线跟随变化?