【QT】画正弦曲线

直接上代码
main.cpp

#include "qttest4.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	qttest4 w;
	w.show();
	return a.exec();
}

qtteest4.h

#ifndef QTTEST4_H
#define QTTEST4_H

#include <QtWidgets/QMainWindow>
#include "ui_qttest4.h"

class qttest4 : public QMainWindow
{
	Q_OBJECT
public:
	qttest4(QWidget *parent = 0);
	~qttest4();
private slots:
	int OnSettingsChanged();  //自动刷新修改后的参数
private:
	Ui::qttest4Class ui;
};
#endif // QTTEST4_H

qttest4.cpp

#include "qttest4.h"

qttest4::qttest4(QWidget *parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);
	ui.ctlPeriod->setValue(50);       //参数的初始值
	ui.ctlRadius->setValue(1);		 //参数的初始值
	ui.ctlGrain->setValue(50);		 //参数的初始值
	connect(ui.ctlRadius, SIGNAL(valueChanged(int)), this, SLOT(OnSettingsChanged()));  //QSpinBox signals:valueChanged(int i)
	connect(ui.ctlPeriod, SIGNAL(valueChanged(int)), this, SLOT(OnSettingsChanged()));
	connect(ui.ctlGrain, SIGNAL(valueChanged(int)), this, SLOT(OnSettingsChanged()));
}
qttest4::~qttest4()
{

}
int qttest4::OnSettingsChanged()
{
	ui.frame->Adjust(ui.ctlPeriod->value(), ui.ctlGrain->value(), ui.ctlRadius->value()); //ui.frame就是提升的那个窗口,Ajust是在Afsin.h中自定义的函数。
	return 0;
}

qttest4.ui
在这里插入图片描述
Afsin.h

#ifndef AFSIN_H
#define AFSIN_H

#include <QFrame>

class Afsin : public QFrame
{
	Q_OBJECT
public:
	Afsin(QWidget *parent);
	~Afsin();
	//qttest4.cpp传参过来
	void Adjust(int period, int grain, int radius);
	//QT的窗体坐标系
	//GUI坐标系:左上角为原点,x向右增长,y向下增长
	//数学坐标系:中心为原点,x向右增长,y向上增加
	
	//得出的是按照QT GUI坐标点的值
	QPoint origin();
	//将GUI窗口的点(x,y)转成坐标系统里的点
	QPoint toCoord(QPoint p);
	//将坐标系内的(x,y)转成GUI的坐标
	QPoint fromCoord(QPoint p);
private:
	virtual void paintEvent(QPaintEvent*event);
private:
	int m_period, m_grain, m_radius;	
};
#endif // AFSIN_H

Afsin.cpp

#include "Afsin.h"
#include <QPainter>
#include <math.h>

Afsin::Afsin(QWidget *parent)
	: QFrame(parent)
{
	m_period = 20;
	m_grain = 1;
	m_radius = 10;
}
Afsin::~Afsin()
{

}
void Afsin::Adjust(int period, int grain, int radius)
{
	m_period = period;
	m_grain = grain;
	m_radius = radius;
	update();
}
QPoint Afsin::origin()
{
	//坐标系原点
	QRect r = this->rect();
	return r.center();
}
//将GUI窗口的点(x,y)转换成坐标系统里的点
QPoint Afsin::toCoord(QPoint p)
{
	//圆心
	QPoint o = this->origin();
	QPoint result = p - o;
	result.setY(0 - result.y()); //y坐标反转
	return result;
}
//将坐标系内的(x,y)转成GUI的坐标
QPoint Afsin::fromCoord(QPoint p)
{
	//圆心
	QPoint o = this->origin();
	p.setY(0 - p.y()); //y坐标反转
	return p + o;
}
void Afsin::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));
	//正弦曲线:从坐标原点,向左,向右伸展
	//向右伸展
	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;
	}
}

结果
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42104289/article/details/86299387