Kiedy emitować dataChanged z QAbstractItemModel

W Qt mam podklasę modeluQAbstractItemModel - to drzewo wyświetlane w QTreeView.

Model obsługuje różne formy zmian, które działają poprawnie. Dwa istotne są:

1) Niektóre dane w niewielkiej liczbie powiązanych wierszy ulegają zmianie

2) Zmiana wizualizacji oznacza, że ​​większość wierszy powinna zmienić formatowanie - w szczególności mają one zmianę podświetlenia tła. IchDisplayRole dane się nie zmieniają.

Obecny projekt dotyczy obu z nich w ten sam sposób: dla każdego wiersza, który ma jakąkolwiek zmianę, model emitujedataChanged(start_of_row_index,end_of_row_index). Emituję sygnał zarówno dla zmieniających się wierszy macierzystych, jak i dla każdego z ich dzieci, które się zmieniły.

Jednak w przypadku 2 działa to źle, ponieważ model staje się duży: bardzo duża liczbadataChanged emitowane są sygnały.

Zmieniłem kod tak, że w przypadku 2 model emitujedataChanged tylko dla (pojedynczego) wiersza, który jest rodzicem całego drzewa.

Wydaje się, że to nadal działa poprawnie, ale nie zgadza się z moim rozumieniem obowiązków modelu. Ale podejrzewam, że mogę się mylić.

Być może źle rozumiemdataChanged sygnał? Czy rzeczywiście powoduje, że widok aktualizuje wszystkie dzieci, a także określony zakres? Albo mogę uniknąć emisjidataChanged kiedy nie jestDisplayRole to się zmienia?

Redagowałem moje dotychczasowe postępy

Jak wskazuje Jan, powinienem emitowaćdataChanged albo dla większości, albo dla wszystkich rzędów w przypadku 2.

Mój kod pierwotnie zrobił to przez emisjędataChanged dla każdego zmienionego wiersza, ale jest to zbyt kosztowne - widok zajmuje zbyt dużo czasu, aby przetworzyć wszystkie te sygnały.

Możliwym rozwiązaniem może być agregacjadataChanged sygnał dla dowolnych sąsiadujących bloków zmienionych wierszy, ale to nadal nie będzie działać dobrze, gdy na przykład co drugi rząd się zmienił - nadal emitowałby zbyt wiele sygnałów.

Idealnie chciałbym po prostu powiedzieć widokowi, aby traktował wszystkie dane jako potencjalnie zmienione (ale wszystkie indeksy są nadal ważne - układ nie zmienił się). Nie wydaje się to możliwe przy pojedynczym sygnale.

Z powodu dziwactwaQTreeView klasa, jest możliwe (choć niepoprawne zgodnie ze specyfikacją) emitowanie tylko jednegodataChanged(tl,br) tak długo jaktl != br. Pracowałem nad tym i przeszliśmy nasze testy, ale denerwowałem.

Na razie zdecydowałem się na wersję, która przechodzi przez drzewo i emituje pojedynczydataChanged(tl,br) dla każdego rodzica (z tl, br obejmującym wszystkie dzieci tego rodzica). Jest to zgodne z protokołem model / widok i dla naszych modeli zazwyczaj zmniejsza liczbę sygnałów o około 10 razy.

Nie wydaje się to jednak idealne. Jakieś inne sugestie?

questionAnswers(1)

yourAnswerToTheQuestion