• 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;
    
    }

    结果:

  • 相关阅读:
    Html Document窗口的尺寸和位置
    如何在浏览器窗口上添加一个遮罩层
    mysql用户管理
    微信开发者工具 一键格式化与快捷键大全
    lua脚本加密与解密、luaR、ssulua、DZSH算法
    关于蓝奏云网盘地址无法打开问题
    lua脚本中如何获取当前时间与如何注解
    GG修改器常用参数大全与lua脚本的基本编写
    GG修改器的基本使用与lua脚本的基本认识
    小程序学习
  • 原文地址:https://www.cnblogs.com/fuhang/p/9901091.html
Copyright © 2020-2023  润新知