不需要别的UI设置,直接放在QT文件中即可
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QTimer>//定时器头文件 #include <QVector>//容器头文件 #include <QPainter> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: //explicit显式构造,避免隐式构造 explicit MainWindow(QWidget *parent = nullptr); //构造函数 ~MainWindow();//析构函数 private: Ui::MainWindow *ui; QTimer *timer;//定时器 QVector<QPoint> point_arry;//保存所有的坐标容器 //界面刷新的时候,会自动调用函数 void paintEvent(QPaintEvent *event); //定时器处理函数 public slots: //定义槽函数 void timer_timeout(void); }; #endif // MAINWINDOW_H
#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); //初始化变量 qsrand(3); timer = new QTimer(this); //timer的超时时间与处理函数链接起来,时间来刷新槽函数 connect(timer,SIGNAL(timeout()),this,SLOT(timer_timeout())); //启动定时器 timer->start(100); } MainWindow::~MainWindow() { delete ui; } void MainWindow::paintEvent(QPaintEvent *event) { //todo 界面刷新时,执行 将点连成线RER //准备画笔 QPainter painter(this); QPen pen; pen.setWidth(2);//设置画刷的像素宽度 pen.setBrush(QBrush(Qt::green));//设置画刷的颜色 painter.setPen(pen); painter.setRenderHint(QPainter::Antialiasing);//画刷抗锯齿 int i; for(i=1;i<point_arry.size();i++){ QPoint p1=point_arry[i-1]; //p1 等于point_arry上一点 QPoint p2=point_arry[i]; //p2 等于point_arry目前的点 painter.drawLine(p1,p2);//将p1与p2链接起来 } } //槽函数的实现 void MainWindow::timer_timeout() { //todo 定时器到时执行的任务 移动Y轴 static int x = 0;//static 下次不在从零开始 int y; if(x<this->width()){//如果x现在在主窗口的宽度内 y = this->height()/2+rand()%200-100;//y轴移动的取值,将y值放在height中间 point_arry.push_back(QPoint(x,y));//point_arry的类型就是QPoint类型的 x+=5;//每次移动的x轴长度 } else{//如果x轴的长度超出窗口的长度 int i; for(i=1;i<point_arry.size();i++){ point_arry[i-1].setY(point_arry[i].y());//将arry中y的值与上一个y值交换 } point_arry[point_arry.size()-1].setY(this->height()/2+rand()%200-100);//设置目前的y值 } this->update(); }