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;

}

结果:

原文地址:https://www.cnblogs.com/fuhang/p/9901091.html

时间: 2024-10-13 04:02:37

qt 自定义窗口绘制正弦曲线的相关文章

Qt自定义窗口部件

QtDesigner自定义窗口部件有两种方法:改进法(promotion)和插件法(plugin) 改进法 1.改进法之前,要先写好子类化QSpinBox后的HexspinBox.h和HexspinBox.cpp文件.把这两个文件拷贝到想要的项目中. HexspinBox.h Cpp代码   #ifndef HEXSPINBOX_H #define HEXSPINBOX_H #include <QSpinBox> class QRegExpValidator; class HexSpinBox

QT自定义窗口(模拟MainWindow)

在这里自定义窗口是通过继承于QFrame,内部分为上下两部分,上半部分就是标题栏,下面是窗口的具体内容.上下两部分通过布局固定位置.最后窗口的各种鼠标拖动,缩放,等操作通过添加鼠标事件来完成一个窗口的常规功能.当然,这个标题栏可以通过布局的改变把它放到任意地方. 下面是实现的代码: #pragma once #ifndef CUSTOMWIDGET_H_ #define CUSTOMWIDGET_H_ #include <QtWidgets/QFrame> class QToolButton;

qt中窗口绘制——图片的绘制

在qt 中,QPixmap 用于表示一张图片,支持png,jpg格式的加载. QPixmap pm("c:/test.png"); 或者 QPixmap pm; pm.load("c:/test/png"); QT中图片的路径分为两种: (1)文件系统中的图片:使用绝对路径或者相对路径. (2)资源中的文件:以冒号开头例如:/Test/source/logo.jpg 绘制的参数: (1)源矩形 可以绘制图形的全部,也可以绘制其中的一部分. QRect source(

Qt自定义窗口,继承自QDialog,执行后返回rejected的问题分析

自定义了一个弹出窗口,添加了一个确定按钮,并定义了槽函数,处理结束后,调用 close(); 退出窗口,监测到返回值是Rejected十分不解,反复查看帮助文档,后来发现,使用Close()关闭窗口,本身就是拒绝窗口结果. 要调用 accept(); 来关闭窗口,返回值才会是Accepted.

QT自定义opengl的Widget绘制Mat

QT自定义opengl的Widget绘制Mat 宽高 512 修改名字mat 自定义类型 提升为   提升为MatView类   类型已经改变为MatView   新建MatView类cpp文件   添加头文件 修改构造函数(函数实现,调用父类构造函数) 添加宏定义   重载绘制函数 只显示图片使用paintEvent() 若绘制视频相关,需要使用repaint.update相关函数   只要窗口发生变化,都会调用该函数(如:窗口移动了,所以相关业务逻辑,不能放入,只做绘图的业务)   工程文件

paip.提升用户体验---c++ qt自定义窗体(1)---标题栏的绘制

源地址:http://blog.csdn.net/attilax/article/details/12343625 paip.提升用户体验---c++ qt自定义窗体(1)---标题栏的绘制 效果图: 作者Attilax ,  EMAIL:[email protected] 来源:attilax的专栏地址:http://blog.csdn.net/attilax 第一步:去掉系统默认标题栏 1 第2步:添加自定义标题栏以及最小化,最大化.关闭按钮...还有左边的窗体小图标.. 2 第3步:添加标

QT笔记之自定义窗口拖拽移动

1.QT自定义标题栏,拖拽标题栏移动窗口(只能拖拽标题,其他位置无法拖拽) 方法一: 转载:http://blog.sina.com.cn/s/blog_4ba5b45e0102e83h.html .h文件中 1 //自己重新实现拖动操作 2 protected: 3 4 void mouseMoveEvent ( QMouseEvent * event ); 5 6 void mousePressEvent ( QMouseEvent * event ); 7 8 void mouseRele

C++ GUI Qt4编程-创建自定义窗口部件

C++ GUI Qt4编程-创建自定义窗口部件 Qtqt4 通过Qt窗口部件进行子类化或者直接对QWidget进行子类化,就可以创建自定义窗口部件,下面示范两种方式,并且也会说明如何把自定义窗口部件集成到Qt设计师中,这样就可以像使用内置的Qt窗口部件一样来使用它们,最后展示使用双缓冲技术(一种用于快速绘制的强大技术)的自定义窗口部件. 1.自定义Qt窗口部件 我们发现Qt窗口部件需要更多的自定义定制,这些定制可能要比它在Qt设计师里设置的属性或者对它调用的那些函数更多一些,一个简单而直接的解决

( 转)浅谈QT中窗口刷新事件

浅谈QT中窗口刷新事件 [日期:2011-06-25] 来源:Linux社区  作者:袁硕 [字体:大 中 小] 经过一个星期的项目初步开发,写此文就开发时遇到的一些常见问题,给出些资料和自己的观点,希望能给其他的初学者或者参赛的选手一点帮助,当然,也算是一种抛砖引玉,大家有什么好的技巧经验什么的,也能多多分享,借助这次比赛,我们共同进步~ 如果大家都是跟我一样,刚刚开始接触QT,开始开发QT的程序,肯定也会有很多不习惯的地方,今天我重点想谈的就是这么一个不习惯的地方——QT中窗口刷新事件. 对