Когда отправлять dataChanged из QAbstractItemModel

В Qt у меня есть модель подклассовQAbstractItemModel - это дерево, отображаемое в QTreeView.

Модель поддерживает различные формы изменений, которые работают нормально. Двумя актуальными являются:

1) Изменяются некоторые данные в небольшом количестве связанных строк

2) Изменение визуализации означает, что большинство строк должны изменить свое форматирование - в частности, они имеют изменение подсветки фона. ИхDisplayRole данные не меняются.

Нынешний дизайн рассматривает оба из них одинаково: для каждой строки, которая имеет какое-либо изменение, которое излучает модельdataChanged(start_of_row_index,end_of_row_index), Я излучаю сигнал для обеих родительских строк, которые меняются, и для любых их дочерних элементов, которые изменились.

Однако, это плохо работает в случае 2, поскольку модель становится большой: очень большое количествоdataChanged сигналы испускаются.

Я изменил код так, чтобы в случае 2 модель излучалаdataChanged только для (единственной) строки, которая является родителем всего дерева.

Это все еще работает правильно, но не согласуется с моим пониманием обязанностей модели. Но я подозреваю, что могу ошибаться.

Возможно, я неправильно понимаюdataChanged сигнал? Фактически ли это вызывает представление, чтобы обновить все дочерние элементы, а также указанный диапазон? Или я могу избежать излученияdataChanged когда это неDisplayRole что меняется?

Отредактировано с моим прогрессом до сих пор

Как указывает Ян, я должен излучатьdataChanged либо для большинства, либо для всех строк в случае 2.

Мой код изначально сделал это путем излученияdataChanged для каждой измененной строки, но это слишком дорого - просмотр занимает слишком много времени для обработки всех этих сигналов.

Возможным решением может быть объединениеdataChanged сигнал для любых смежных блоков измененных строк, но это все равно не будет работать хорошо, например, когда изменился каждый второй ряд - он все равно будет излучать слишком много сигналов.

В идеале я хотел бы просто сказать, чтобы представление рассматривало все данные как потенциально измененные (но все индексы все еще действительны - компоновка не изменилась). Это кажется невозможным с одним сигналом.

Из-за причудыQTreeView класс, возможно (хотя и некорректно согласно спецификации) испускать только одинdataChanged(tl,br) так долго какtl != br, У меня это работало, и оно прошло наше тестирование, но заставило меня нервничать

Я остановился на версии, которая пересекает дерево и испускает одинdataChanged(tl,br) для каждого родителя (с tl, br, охватывающим всех потомков этого родителя). Это соответствует протоколу модель / представление и для наших моделей обычно уменьшает количество сигналов примерно в 10 раз.

Однако это не кажется идеальным. Любые другие предложения кто-нибудь?

Ответы на вопрос(1)

Ваш ответ на вопрос