Привет всем Qt Модель/представление гуру программирования здесь, в Stackoverflow. Проект, над которым я работаю, требует, чтобы я определил модель QAbstractItemModel для XML-данных. Ранее я задавал вопрос, когда у меня возникла проблема во время реализации этой модели: QSortFilterProxyModel crashes when deleting a row from the source model via the source model functionQAbstractItemModel: зачем испускать данные. Изменять и вставлять сигналы строк при медленном вводе многочисленных элементов в модель?
Модель в настоящее время хорошо работает в приложении, за исключением некоторых проблем с производительностью, которые я не знаю, как решить , Одной из функций этого приложения является добавление узлов xml-элемента Frame, установив числа Max Num и Rand. Каждый элемент Frame будет иметь номера Num и Rand, начиная от 0 до MaxNum - 1 и 0 до MaxRand-1 соответственно. Кроме того, мне нужно будет добавить дочерний элемент Parameter для Rand = 0 th и Rand = MaxRand-1-й элемент каждый. Сокращенно иллюстрации выглядит следующим образом:
For Max Num=100, Max Rand=50
<Frame Num="0" Rand="0">
<Parameter Value="false"/>
</Frame>
<Frame Num="0" Rand="1"/>
<Frame Num="0" Rand="2"/>
...
<Frame Num="0" Rand="48"/>
<Frame Num="0" Rand="49">
<Parameter Value="true"/>
</Frame>
<Frame Num="1" Rand="0">
<Parameter Value="false"/>
</Frame>
<Frame Num="1" Rand="1"/>
<Frame Num="1" Rand="2"/>
...
<Frame Num="1" Rand="48"/>
<Frame Num="1" Rand="49">
<Parameter Value="true"/>
</Frame>
...
<Frame Num="99" Rand="0">
<Parameter Value="false"/>
</Frame>
<Frame Num="99" Rand="1"/>
<Frame Num="99" Rand="2"/>
...
<Frame Num="99" Rand="48"/>
<Frame Num="99" Rand="49">
<Parameter Value="true"/>
</Frame>
Приложение работает нормально, когда оба MAXNUM и MaxRand маленькие т.е. общее число элементов рамка вокруг 50. Однако, когда счетчик элемент выходит за пределы 500 или около того, добавление рамы элементы через QAbstractItemModel функции становятся болезненно и экспоненциально медленными. Графический интерфейс замерзает в течение длительного периода времени, до такой степени, что я почти не ожидал.
MAJOR UPDATE:
Я обнаружил, что вызывает замедление при установке большого количества, скажем, 1000 элементов в мою модель. Я вызывал как insertRow (row, parent), так и setData() один раз за введенный элемент, что оказалось очень дорогостоящим из-за сигналов, излучаемых внутри этих функций.
Я изменил код для insertRows (row, 1000, parent) вместо этого и определил новый silentSetData(), который не испускает dataChanged (currIndex, currIndex). Я также включил новую публичную функцию, называемую notifyDataChanges (startRow, endRow, parentIndex), которая поочередно излучает сигнал DataChanged один раз для данного диапазона данных. Все в порядке, но теперь класс вызывающего абонента должен явно вызвать notifyDataChanges после того, как будет вставлен весь набор данных.
Теперь я задаюсь вопросом, почему излучение данных с измененными сигналами так дорого? Кто-нибудь пробовал другие способы преодолеть эту проблему при вставке/изменении большого количества элементов в модели сразу?
Мне известно о beginResetModel. Я использовал его для начальной загрузки XML-файла в модель. У меня создалось впечатление, что повторный набор модели не должен использоваться часто, поскольку он сбрасывает все прикрепленные представления и, возможно, замедляет работу графического интерфейса, но, похоже, я ошибаюсь. – ksming
Исходя из вашего предложения, я добавил версии insertRows, setData и removeRows, которые не выделяют никаких сигналов dataChanged(), ratbi(), ratbr() или других меток. Затем у меня есть вызывающий класс, вызывающий эти (то, что я называл) тихие версии remove, insert и setdata между начальной и конечной версией для выполнения операции массового ввода. Скорость значительно улучшилась! Я отправлю детали в мое решение в ответ на мой вопрос позже для справки. В любом случае ваш ответ будет отмечен как принятый. Благодаря! – ksming
Спасибо. Я предполагаю, что каждый раз, когда вы вызываете 'setData' на больших наборах данных, система событий получает залитые сигналами. – Neox