circlewidget.h

  1. #ifndef CIRCLAWIDGET_H
  2. #define CIRCLAWIDGET_H
  3. #include <QFrame>
  4. #include<QVector>
  5. #include<QMouseEvent>
  6.  
  7. class CircleWidget:public QFrame
  8. {
  9. Q_OBJECT
  10. public:
  11. CircleWidget(QWidget *parent);
  12. ~CircleWidget();
  13. private:
  14. void paintEvent(QPaintEvent *event);
  15.  
  16. public:
  17. void Adjust(int period, int grain, int radius);
  18. QPoint origin(); // 坐标原点位置
  19. QPoint toCoord(QPoint p); // 将GUI窗口的点(x,y)转换成坐标系统里的点
  20. QPoint fromCoord(QPoint p); // 将坐标系内的(x,y)转成GUI的坐标
  21. private:
  22.  
  23. int m_period, m_grain, m_radius;
  24.  
  25. };
  26.  
  27. #endif // CIRCLAWIDGET_H

circlewidget.cpp

  1. # include"circlewidget.h"
  2. #include<QPainter>
  3. #include<QDebug>
  4. #include<math.h>
  5.  
  6. CircleWidget::CircleWidget(QWidget *parent):QFrame(parent)
  7. {
  8. m_period = ; //周期
  9. m_grain = ; //粒度
  10. m_radius = ; // 振幅
  11. }
  12. CircleWidget::~CircleWidget()
  13. {
  14.  
  15. }
  16. void CircleWidget::paintEvent(QPaintEvent *event)
  17. {
  18. QPainter painter(this);
  19.  
  20. int width = this->width();
  21. int height = this->height();
  22. QRect rect(,, width, height);
  23.  
  24. // 设置背景为黑色
  25. painter.setBrush(QBrush(QColor(0x00,0x00, 0x00)));
  26. painter.drawRect(rect);
  27.  
  28. painter.setPen(QPen(QColor(, , ))); // 设置线条为绿色
  29.  
  30. QPoint o = origin();
  31. painter.drawLine(QPoint(, o.y()), QPoint(width, o.y())); // x轴
  32. painter.drawLine(QPoint(o.x(), ), QPoint(o.x(), height));// y轴
  33.  
  34. // 正弦曲线: 从坐标原点,向左、向右伸展
  35. QPoint p1(,);
  36. for(int x=; x<width/; x+=m_grain)
  37. {
  38. // y=sin(x)
  39. double angle = (double) x / m_period * * 3.1415926;
  40. double y = m_radius * sin(angle);
  41. QPoint p2(x, y);
  42.  
  43. // 右侧
  44. painter.drawLine(fromCoord(p1), fromCoord(p2));
  45.  
  46. // 左侧
  47. QPoint base(,);
  48. painter.drawLine(fromCoord(base-p1), fromCoord(base-p2));
  49.  
  50. p1 = p2;
  51. }
  52.  
  53. }
  54.  
  55. void CircleWidget::Adjust(int period, int grain, int radius)
  56. {
  57. m_period = period;
  58. m_grain = grain;
  59. m_radius = radius;
  60. update(); // 更新重绘
  61. }
  62.  
  63. QPoint CircleWidget::origin()
  64. {
  65. QRect r = this->rect();
  66. return r.center();
  67. }
  68. // 将GUI窗口的点(x,y)转换成数学坐标系统里的点
  69. QPoint CircleWidget::toCoord(QPoint p)
  70. {
  71. // 圆心
  72. QPoint o = this->origin();
  73. QPoint result = p - o;
  74. result.setY( - result.y()); // y坐标反转
  75. return result;
  76. }
  77. // 将数学坐标系内的(x,y)转成GUI的坐标
  78. QPoint CircleWidget::fromCoord(QPoint p)
  79. {
  80. // 圆心
  81. QPoint o = this->origin();
  82. p.setY( - p.y()); // y坐标反转
  83. return p + o;
  84.  
  85. }

结果:

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. _mysql_exceptions.IntegrityError: (1062, "Duplicate entry, Python操作MySQL数据库,插入重复数据

    [python] view plain copy sql = "INSERT  INTO test_c(id,name,sex)values(%s,%s,%s)" param =  ...

  2. wpf绑定元素属性

  3. java数字金额转中文大写

    package com.example.convert; import java.text.DecimalFormat; import java.util.Scanner; /** * 金额转换 * ...

  4. java-异常处理2

    一 编译时异常和运行时异常的区别 java认为如果你的程序有问题,你应该让调用者知道. 例如:面包,长毛了.用户去买了,用户可能会挂 .应该在面包上贴上标签(异常). java 如果在函数内抛出Exc ...

  5. linux引导和登录/注销配置文件

    引导和登录/注销 /etc/issue & /etc/issue.net 这些文件由 mingetty(和类似的程序)读取,用来向从终端(issue)或通过 telnet 会话(issue.n ...

  6. ubuntu安装搜狗输入法后无法使用goland的快捷键 ctrl+alt+B

    安装了搜狗拼音后,其快捷键ctrl+alt+b会启动软键盘,造成与其他编辑器快捷键的冲突. 为了禁止使用ctrl+alt+b启动软键盘,可以: 1. 在搜狗拼音输入法选择设置 2. 高级设置 3. 高 ...

  7. 微信小程序-- WXML语法

    页面数据 test.js test.wxml 运行结果:

  8. 对于MD5加密处理方式

    来源:http://blog.51cto.com/xqtesting/1924977 但有时候我们请求的参数可能需要加密,比如登录接口中的密码可能需要经过md5加密这时候怎么处理呢? 这种方法比较简单 ...

  9. SVN failed: 405 Method Not Allowed

    SVN update 时,错误:PROPFIND request on '/svn/xxxx' failed: 405 Method Not Allowed. 解决办法如下: 第一步:查看SVN服务器 ...

  10. 从0开始学习 GitHub 系列之「01.初识 GitHub

    转载:http://blog.csdn.net/googdev/article/details/52787516 1. 写在前面 我一直认为 GitHub 是程序员必备技能,程序员应该没有不知道 Gi ...