直接上代码
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;
}
}
结果