2012-02-07 2 views
1

Привет всем 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 после того, как будет вставлен весь набор данных.

Теперь я задаюсь вопросом, почему излучение данных с измененными сигналами так дорого? Кто-нибудь пробовал другие способы преодолеть эту проблему при вставке/изменении большого количества элементов в модели сразу?

ответ

4

Другой способ сделать это - явно сбросить структуры данных модели. Например, в одной из моих моделей данные представлены QStringList. Я реализовал функцию, которая сбрасывает данные в модели. Например:

void MyModel:setNewData(const QStringList newList) { 

    beginResetModel(); 

    m_dataList = newList; 

    endResetModel(); 
} 

Я бы предположил, что этот подход применим и в вашем случае.

+0

Мне известно о beginResetModel. Я использовал его для начальной загрузки XML-файла в модель. У меня создалось впечатление, что повторный набор модели не должен использоваться часто, поскольку он сбрасывает все прикрепленные представления и, возможно, замедляет работу графического интерфейса, но, похоже, я ошибаюсь. – ksming

+0

Исходя из вашего предложения, я добавил версии insertRows, setData и removeRows, которые не выделяют никаких сигналов dataChanged(), ratbi(), ratbr() или других меток. Затем у меня есть вызывающий класс, вызывающий эти (то, что я называл) тихие версии remove, insert и setdata между начальной и конечной версией для выполнения операции массового ввода. Скорость значительно улучшилась! Я отправлю детали в мое решение в ответ на мой вопрос позже для справки. В любом случае ваш ответ будет отмечен как принятый. Благодаря! – ksming

+0

Спасибо. Я предполагаю, что каждый раз, когда вы вызываете 'setData' на больших наборах данных, система событий получает залитые сигналами. – Neox

 Смежные вопросы

  • Нет связанных вопросов^_^