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 = ; //周期
m_grain = ; //粒度
m_radius = ; // 振幅
}
CircleWidget::~CircleWidget()
{ }
void CircleWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this); int width = this->width();
int height = this->height();
QRect rect(,, width, height); // 设置背景为黑色
painter.setBrush(QBrush(QColor(0x00,0x00, 0x00)));
painter.drawRect(rect); painter.setPen(QPen(QColor(, , ))); // 设置线条为绿色 QPoint o = origin();
painter.drawLine(QPoint(, o.y()), QPoint(width, o.y())); // x轴
painter.drawLine(QPoint(o.x(), ), QPoint(o.x(), height));// y轴 // 正弦曲线: 从坐标原点,向左、向右伸展
QPoint p1(,);
for(int x=; x<width/; x+=m_grain)
{
// y=sin(x)
double angle = (double) x / m_period * * 3.1415926;
double y = m_radius * sin(angle);
QPoint p2(x, y); // 右侧
painter.drawLine(fromCoord(p1), fromCoord(p2)); // 左侧
QPoint base(,);
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( - result.y()); // y坐标反转
return result;
}
// 将数学坐标系内的(x,y)转成GUI的坐标
QPoint CircleWidget::fromCoord(QPoint p)
{
// 圆心
QPoint o = this->origin();
p.setY( - p.y()); // y坐标反转
return p + o; }

结果:

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

  1. QT自定义窗口(模拟MainWindow)

    在这里自定义窗口是通过继承于QFrame,内部分为上下两部分,上半部分就是标题栏,下面是窗口的具体内容.上下两部分通过布局固定位置.最后窗口的各种鼠标拖动,缩放,等操作通过添加鼠标事件来完成一个窗口的 ...

  2. Qt自定义窗口部件

    QtDesigner自定义窗口部件有两种方法:改进法(promotion)和插件法(plugin)   改进法   1.改进法之前,要先写好子类化QSpinBox后的HexspinBox.h和Hexs ...

  3. QT自定义窗口

    qt 中允许自定义窗口控件,使之满足特殊要求, (1)可以修改其显示,自行绘制 (2)可以动态显示 (3)可以添加事件,支持鼠标和键盘操作 自定义控件可以直接在QtDesigner里使用,可以直接加到 ...

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

    在qt 中,QPixmap 用于表示一张图片,支持png,jpg格式的加载. QPixmap pm("c:/test.png"); 或者 QPixmap pm; pm.load(& ...

  5. qt 自定义窗口显示鼠标划过的轨迹

    鼠标事件分为四种: 1.按下 2.抬起 3.移动 4.双击 鼠标事件继承与QWidget void mouseDoubleClickEvent(QMouseEvent *event) void mou ...

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

    源地址:http://blog.csdn.net/attilax/article/details/12343625 paip.提升用户体验---c++ qt自定义窗体(1)---标题栏的绘制 效果图: ...

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

    1.QT自定义标题栏,拖拽标题栏移动窗口(只能拖拽标题,其他位置无法拖拽) 方法一: 转载:http://blog.sina.com.cn/s/blog_4ba5b45e0102e83h.html . ...

  8. Qt入门(19)——自定义窗口部件

    我们介绍可以画自己的第一个自定义窗口部件.我们也加入了一个有用的键盘接口.我们添加了一个槽:setRange().        void setRange( int minVal, int maxV ...

  9. WPF绘制自定义窗口

    原文:WPF绘制自定义窗口 WPF是制作界面的一大利器,下面就用WPF模拟一下360的软件管理界面,360软件管理界面如下: 界面不难,主要有如下几个要素: 窗体的圆角 自定义标题栏及按钮 自定义状态 ...

随机推荐

  1. CesiumLab V1.4 分类3dtiles生成(倾斜单体化、楼层房间交互)我记得我是写过一篇关于倾斜单体化的简书文章的,但是现在找不到了。不过找不到也好,就让他随风逝去吧,因为当时我写那篇文章的时候,就发现了cesium实际是有另一种更高效的单体化。就下面这个示例https://cesiumjs.org/Cesium/Build/Apps/Sandcastle/index.html?src=

    我记得我是写过一篇关于倾斜单体化的简书文章的,但是现在找不到了.不过找不到也好,就让他随风逝去吧,因为当时我写那篇文章的时候,就发现了cesium实际是有另一种更高效的单体化.就下面这个示例 http ...

  2. angular4 自定义表单组件

    自定义表单组件分为单值组件和多值组件. 单值组件:input/select/radio/textarea 多值组件:checkbox/tree组件 条件: 1.必须实现ControlValueAcce ...

  3. python基础--包、logging、hashlib、openpyxl、深浅拷贝

    包:它是一系列模块文件的结合体,表现形式就是一个文件夹,该文件夹内部通常会有一个__init__.py文件,包的本质还是一个模块. 首次导入包:(在导入语句中中 . 号的左边肯定是一个包(文件夹)) ...

  4. python Pandas文件读写

  5. centos部分网站无法访问问题的解决

    CentOS 5内核对TCP的读缓冲区大小有缺省设置,缺省为:net.ipv4.tcp_rmem = 4096 87380 4194304 解决办法就是将最后一个数字改小一点,具体操作就是在文件/et ...

  6. LINUX配置文件介绍

    每个 Linux 程序都是一个可执行文件,它含有操作码列表,CPU 将执行这些操作码来完成特定的操作.例如,ls 命令是由 /bin/ls 文件提供的,该文件含有机器指令的列表,在屏幕上显示当前目录中 ...

  7. SASS:sass语法参照列表及教程

    http://sass-lang.com/documentation/file.SASS_REFERENCE.html 保存一下,上面的链接包括了scss中所有语法规则. 转载自:http://www ...

  8. 交互题(apio2016Gap)

    题目链接   //Serene #include<algorithm> #include<iostream> #include<cstring> #include& ...

  9. Hdu 4923(单调栈)

    题目链接 Room and Moor Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Ot ...

  10. oracle默认日期格式

    有关 Oracle 数据库中支持的语言的完整列表,以及与区域设置相关的信息细节,请参阅 Oracle Database Globalization Support Guide. 默认日期格式 小时.日 ...