QCustomPlot实时绘图点击重启按钮延迟增大卡顿问题求解
问题原因
- 核心问题:信号槽重复绑定:你在
on_pushButton_restart_clicked()函数里每次点击按钮都会执行一次信号槽绑定操作,Qt默认允许同一信号和槽的组合重复绑定,每多绑定一次,timer_plot触发timeout信号时realtimePlot槽函数就会多执行一次。点击重启的次数越多,同一时间内需要执行的绘图逻辑次数就越多,CPU占用持续飙升,直接导致动画流畅度逐次下降。 - 次要问题:静态变量未重置:
realtimePlot()函数中的lastPointKey是静态变量,函数执行结束后数值会一直保留。你点击重启按钮后my_timer会归零重启,但lastPointKey还是上一次绘图结束时的旧值,需要等my_timer的运行时长超过这个旧值才会触发数据更新,所以每次重启的启动延迟会逐次变长。
解决方法
1. 修正信号槽绑定逻辑
把timer_plot的timeout信号和realtimePlot槽的绑定操作移动到MainWindow的构造函数中,全局只绑定一次,从根源避免重复绑定的问题。如果确实需要把绑定逻辑放在按钮点击事件中,可以在connect时指定Qt::UniqueConnection参数防止重复绑定:
connect(&timer_plot, SIGNAL(timeout()), this, SLOT(realtimePlot()), Qt::UniqueConnection);
2. 替换静态变量为类成员变量
删除realtimePlot()里的static double lastPointKey定义,将lastPointKey改为MainWindow类的私有成员变量,每次点击重启按钮时手动将其重置为0即可解决启动延迟的问题:
void MainWindow::on_pushButton_restart_clicked() { ... my_timer->restart(); lastPointKey = 0; // 新增变量重置逻辑 timer_plot.start(20); }
3. 可选优化
你当前的绘图逻辑是每次刷新都清空所有数据再重新添加全量x对应的点,如果后续x的点数进一步增加,可以针对性优化数据更新逻辑,不过完成前两项修改已经可以完全解决你遇到的问题。
内容的提问来源于stack exchange,提问作者deethereal
相关产品推荐
相关产品推荐

