0

我正在写一个研究项目,我需要绘制一个依赖于实时的函数。我使用了 QCustomPlot。当我按下按钮时,该图应该开始绘制。所以我写了下一个代码

void MainWindow::on_pushButton_restart_clicked()
{
... 
my_timer->restart();
/* Set up and initialize the graph plotting timer */ 
connect(&timer_plot, SIGNAL(timeout()), this, SLOT(realtimePlot())); // where QTimer timer_plot
timer_plot.start(20); 
}

realtimePlot()好像

void MainWindow::realtimePlot()
{

    ui->widget->graph(0)->data()->clear();

    double key = my_timer->elapsed() / 1000.0;
    static double lastPointKey = 0;

    if(key - lastPointKey > 0.002)
    {
        for (auto& iter : x) {
            ui->widget->graph(0)->addData(iter, sin(iter+key));
        }
        lastPointKey = key;
    }
    ui->widget->replot();
}

它工作正常,但是当我想重新启动绘图并再次按下按钮时,在绘制绘图之前会有一个延迟,并且随着每次单击按钮而增加,并且绘图的动画变得越来越不流畅。为什么会发生这种情况,我该如何解决?

在这里,您可以观看我的截屏视频。

我从这里获取的实时绘图代码

MainWindow()

QVector<double> x;
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->widget->addGraph();
    ui->widget->xAxis->setRange(0, 20);
    my_timer->start();
    h = 0.05;
    x.push_back(0);
    for (int i=1; i<=20/h; i++)
    {
        x.push_back(i*h);
    }
}
4

1 回答 1

0

好吧,我发现了问题。是的my_timer->restart(),但我仍然不知道为什么会导致延迟。根据文档,此功能只是停止并启动计时器。

PS 取决于编译器,它可能不起作用。例如,与clang不同, MinGW不适用于此解决方案

于 2021-09-15T07:02:45.690 回答