Я пытаюсь создать класс графического графика в реальном времени в qt, и прокрутка работает. Но при просмотре моей программы в диспетчере задач я понял, что использование ЦП и ОЗУ увеличивается со временем (и данными).
Поэтому я подумал, что было бы неплохо использовать 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.
Но всегда при достижении remove=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 (Проверено и с другими числами).
QVector::remove
принимает индекс удаляемого элемента. Неясно, какm_series->remove(m_axisX->min());
, а затем увеличениеmin
и повторный вызовm_series->remove(m_axisX->min());
должны работать правильно. Предположим, что старый min равен 42, вы удаляете элемент с индексом 42, тогда почему при следующем вызове вы хотите удалить элемент с индексом 43? - person 463035818_is_not_a_number   schedule 31.03.2021m_axisX
? - person G.M.   schedule 31.03.2021QVector
. ПОЖАЛУЙСТА, прочитайте минимально воспроизводимый пример. Код, который вы разместили, может быть правильным или нет, в зависимости от кода, который вы не опубликовали. - person 463035818_is_not_a_number   schedule 31.03.2021m_series
содержит все точки данных? Если вы двигаетесь влево, я ожидаю, что вы всегда удаляете первый элемент. Почему индекс удаляемого элемента определяется текущим значением оси min ? - person 463035818_is_not_a_number   schedule 31.03.2021m_series
и удаляете из него один элемент, т.е. количество элементов остается прежним, но индекс, который вы хотите удалить, увеличивается неограничен, поэтому вполне естественно, что в какой-то момент он выйдет за пределы. Что мне не хватает? Есть ли какой-то код, который добавляет больше элементов в вектор? Осьmin
где-то уменьшилась? - person 463035818_is_not_a_number   schedule 31.03.2021m_axis.min()
и посколькуmin
увеличивается с шагом1
, но вектор имеет только 21 элемент, вы не можете стереть элемент с индексом 22. Это просто предположение, но я думаю, вам просто нужноm_series->remove(0);
- person 463035818_is_not_a_number   schedule 31.03.2021m_axisX->min()
, код слишком неполный, чтобы я мог его понять, хотя, если вы также не можете объяснить, почему это должен быть элемент с индексомmin
, тогда мое предположение наверное правильно ;) - person 463035818_is_not_a_number   schedule 31.03.2021