Qt Chart系列去除未显示数据崩溃
Qt Chart Series remove not shown data crashes
我正在尝试在 qt 中制作实时绘图图 class 并且滚动有效。
但是当在任务管理器中观看我的程序时,我发现 CPU 和 RAM 使用量随着时间(和数据)的增加而增加。
所以我认为使用remove函数来删除无论如何都没有显示的数据会是一个很好的风格。
这是我的代码:
void Live_Chart::UpdateY(float yValue)
{
xValue++;
this->yValue = yValue;
m_series->append(xValue, yValue);
if (xValue > m_axisX->max())
{
// "Scroll" the data in the view
m_axisX->setMax(xValue);
m_axisX->setMin(m_axisX->min()+1);
// Remove the previous data we don't see
qDebug() << "Removing " << m_axisX->min();
m_series->remove(m_axisX->min());
}
}
此方法每 100 毫秒调用一次,随机数介于 0 和 10 之间。
但总是在达到 removing=52 时程序崩溃并显示此错误消息:
ASSERT failure in QVector<T>::remove: "index out of range", file c:\users\qt\work\qt\qtbase\include\qtcore\../../src/corelib/tools/qvector.h, line 483
我真的不知道为什么是 52。我的程序的任何部分都没有指定这个数字。 x 轴的范围是 50。在创建 QLineSeries 时,我添加了点 (0, 0)。
编辑:
当使用 m_axisX 范围 (0, 20) 时,程序在尝试删除点 22 时崩溃。
--> 删除 x = x-range + 2 的点时程序崩溃(也用其他数字测试过)。
您混淆了向量 m_series
中数据点的索引及其 x
值。当带有 x = old_x_min
的数据点超出您要显示的 window 时,该数据点位于索引 0
而不是索引 old_x_min
.
替换
m_series->remove(m_axisX->min());
和
m_series->remove(0);
删除最旧的数据点,而不是系列中间的一些数据点。
我正在尝试在 qt 中制作实时绘图图 class 并且滚动有效。 但是当在任务管理器中观看我的程序时,我发现 CPU 和 RAM 使用量随着时间(和数据)的增加而增加。
所以我认为使用remove函数来删除无论如何都没有显示的数据会是一个很好的风格。 这是我的代码:
void Live_Chart::UpdateY(float yValue)
{
xValue++;
this->yValue = yValue;
m_series->append(xValue, yValue);
if (xValue > m_axisX->max())
{
// "Scroll" the data in the view
m_axisX->setMax(xValue);
m_axisX->setMin(m_axisX->min()+1);
// Remove the previous data we don't see
qDebug() << "Removing " << m_axisX->min();
m_series->remove(m_axisX->min());
}
}
此方法每 100 毫秒调用一次,随机数介于 0 和 10 之间。
但总是在达到 removing=52 时程序崩溃并显示此错误消息:
ASSERT failure in QVector<T>::remove: "index out of range", file c:\users\qt\work\qt\qtbase\include\qtcore\../../src/corelib/tools/qvector.h, line 483
我真的不知道为什么是 52。我的程序的任何部分都没有指定这个数字。 x 轴的范围是 50。在创建 QLineSeries 时,我添加了点 (0, 0)。
编辑: 当使用 m_axisX 范围 (0, 20) 时,程序在尝试删除点 22 时崩溃。
--> 删除 x = x-range + 2 的点时程序崩溃(也用其他数字测试过)。
您混淆了向量 m_series
中数据点的索引及其 x
值。当带有 x = old_x_min
的数据点超出您要显示的 window 时,该数据点位于索引 0
而不是索引 old_x_min
.
替换
m_series->remove(m_axisX->min());
和
m_series->remove(0);
删除最旧的数据点,而不是系列中间的一些数据点。