利用QT实现X轴为时间动态显示曲线

/*********************************************************************************
  *Author:  zyh
  *Version: 1.0 //版本
  *Date: 2020-01-08 //完成日期
  *Description: 主要实现设置第二张图纸//用于主要说明此程序文件完成的主要功能
                无输入值以及返回值 //与其他模块或函数的接口、输出值、取值范围、
                无/含义及参数间的控制、顺序、独立及依赖关系
**********************************************************************************/
void MainWindow::SetTwoGraph()  //设置第二张图纸
{
    fp3 = ui->widget_lofar; //创建一个画图指针

    fp3->setInteractions(QCP::iRangeDrag|QCP::iRangeZoom| QCP::iSelectPlottables);//可拖拽+可滚轮缩放

    QSharedPointer<QCPAxisTickerDateTime> dateTicker(new QCPAxisTickerDateTime);//日期做X轴
    dateTicker->setDateTimeFormat("hh:mm:ss");//日期格式(可参考QDateTime::fromString()函数)
    fp3->xAxis->setTicker(dateTicker);//设置X轴为时间轴


    fp3->xAxis->setLabel("频率/Hz(单位:*10^4)");//x轴显示文字
    fp3->yAxis->setLabel("幅度/dB");//y轴显示文字
    //fp3->xAxis->setRange(0,5);//当前X轴显示范围
    fp3->yAxis->setRange(0,2.5);//当前y轴显示范围

    //每条曲线都会独占一个graph()
    fp3->addGraph();
    fp3->graph(0)->setPen(QPen(Qt::blue));//曲线颜色

    fp3->graph(0)->setBrush(QBrush(QColor(0,255,255,20)));//曲线与X轴包围区的颜色
    //自动调整XY轴的范围,以便显示出graph(0)中所有的点
    //给第一个graph设置rescaleAxes(),后续所有graph都设置rescaleAxes(true)即可实现显示所有曲线
   /* fp3->graph(0)->rescaleAxes();*/

    //通过传递的轴的QCustomPlot进行注册,简洁理解QCPColorMap的数据为(x轴,y轴;颜色,值value)
    m_pColorMap = new QCPColorMap(fp3->xAxis,fp3->yAxis);
    m_pColorMap->data()->setSize(101,4096);//设置整个图(x,y)点数,X轴50个点,y轴4096个点
    m_pColorMap->data()->setRange(QCPRange(0,2.5),QCPRange(2,0));//setRange是设置X轴以及Y轴的范围

//  for(int x=0;x<=100;x++)
//  {
//    for(int y=0;y<4096;y++)
//    {
//        m_pColorMap->data()->setCell(x,y,qCos(x/10.0)+qSin(y/10.0));
//    }
//  }
    m_pColorMap->setGradient(QCPColorGradient::gpCold);//设置默认渐进色变化(可在QCPColorGradient中查看)
    m_pColorMap->rescaleDataRange(true);

    dataTimer =new QTimer;
    connect(dataTimer, SIGNAL(timeout()), this, SLOT(realtimeDataSlot()));
    dataTimer->start(0); // Interval 0 means to refresh as fast as possible
// 立即刷新图像
    fp3->rescaleAxes();//自适应大小
    ui->widget_lofar->replot();
}




void MainWindow::realtimeDataSlot()
{
    //key的单位是秒
    double key = QDateTime::currentDateTime().toMSecsSinceEpoch()/1000.0;
    //static QTime time(QTime::currentTime());
    // calculate two new data points:
   // double key = time.elapsed()/1000.0;
    qsrand(QTime::currentTime().msec() + QTime::currentTime().second() * 10000);
    //使用随机数产生两条曲线
    double value0 = qrand() % 100;
    double value1 = qrand() % 80;
    //if (ui->checkBox_temp->isChecked())
        fp3->graph(0)->addData(key, value0);//添加数据1到曲线1
    //if (ui->checkBox_hui->isChecked())
       //fp3->graph(1)->addData(key, value1);//添加数据2到曲线2
    //删除8秒之前的数据。这里的8要和下面设置横坐标宽度的8配合起来
    //才能起到想要的效果,可以调整这两个值,观察显示的效果。
    //fp3->graph(0)->removeDataBefore(key-8);
    //fp3->graph(1)->removeDataBefore(key-8);

  //自动设定graph(1)曲线y轴的范围,如果不设定,有可能看不到图像
//也可以用ui->customPlot->yAxis->setRange(up,low)手动设定y轴范围


    fp3->graph(0)->rescaleValueAxis();
   // ui->customPlot->graph(1)->rescaleValueAxis(true);

    //这里的8,是指横坐标时间宽度为8秒,如果想要横坐标显示更多的时间
    //就把8调整为比较大到值,比如要显示60秒,那就改成60。
    //这时removeDataBefore(key-8)中的8也要改成60,否则曲线显示不完整。
    fp3->xAxis->setRange(key+0.25, 8, Qt::AlignRight);//设定x轴的范围
    fp3->replot();
}

最终实现效果如上图

PyQt5.QtChart 是 PyQt5 中的一个模块,它提供了一些强大的图表组件,可以帮助我们快速实现各种类型的图表,包括动态曲线图。 下面是一个简单的示例,演示如何使用 PyQt5.QtChart 实现动态曲线图: ```python from PyQt5.QtWidgets import QApplication, QMainWindow, QGridLayout, QWidget from PyQt5.QtChart import QChart, QChartView, QLineSeries from PyQt5.QtCore import Qt, QTimer import random class MainWindow(QMainWindow): def __init__(self): super().__init__() # 创建曲线图和曲线 self.chart = QChart() self.series = QLineSeries() self.chart.addSeries(self.series) # 设置图表标题和坐标轴标签 self.chart.setTitle("Dynamic Curve") self.chart.setAnimationOptions(QChart.SeriesAnimations) self.chart.createDefaultAxes() self.chart.axes()[0].setTitleText("X") self.chart.axes()[1].setTitleText("Y") # 创建图表视图 self.chart_view = QChartView(self.chart) self.chart_view.setRenderHint(QPainter.Antialiasing) # 创建布局并添加图表视图 layout = QGridLayout() layout.addWidget(self.chart_view) # 创建窗口并设置布局 central_widget = QWidget() central_widget.setLayout(layout) self.setCentralWidget(central_widget) # 创建定时器并连接到更新函数 self.timer = QTimer(self) self.timer.timeout.connect(self.update_plot) self.timer.start(50) # 初始化计数器和数据列表 self.count = 0 self.data = [] def update_plot(self): # 更新计数器和数据列表 self.count += 1 self.data.append(random.randint(0, 100)) # 更新曲线数据 self.series.clear() for i in range(len(self.data)): self.series.append(i, self.data[i]) # 设置坐标轴范围 self.chart.axisX().setRange(max(0, self.count-100), self.count) self.chart.axisY().setRange(0, 100) if __name__ == '__main__': app = QApplication([]) window = MainWindow() window.show() app.exec_() ``` 在这个例子中,我们创建了一个 QMainWindow 窗口,并在其中添加了一个 QChartView 视图,用于显示动态曲线图。我们还创建了一个 QTimer 定时器,并将其连接到 update_plot() 函数,以定期更新曲线图的数据。 在 update_plot() 函数中,我们生成一个随机数,并将其添加到数据列表中。然后,我们清除曲线的所有数据,重新将数据添加到曲线中。最后,我们根据数据的数量调整坐标轴的范围。 请注意,我们使用了一个计数器来记录数据的数量,以便我们可以根据需要滚动我们的曲线图。在这个例子中,我们每次只显示最近的 100 个数据点。 运行这个示例程序,你将会看到一个动态曲线图,显示随机生成的数值。
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值