2011-09-12 22 views
5

Mam problem z moją aplikacją Qt/interview. Używam QTreeView do wyświetlania danych drzewa. Zaimplementowałem własny model oparty na QAbstractItemModel.Błąd Qt "uszkodzone indeksy modelu trwałego" dlaczego?

Otrzymuję następujący błąd przed awarią aplikacji. Zdarza się to często po dodaniu nowego rekordu.

Czy możesz wyjaśnić mi, co oznacza ten błąd. Co to jest QPersistentModelIndex? Nie używam QPersistentModelIndex w moim kodzie.

ASSERT failure in QPersistentModelIndex::~QPersistentModelIndex: "persistent model indexes corrupted" 

Dzięki.

+0

czy użyłeś w swoim układzie sygnałów layoutAboutToBeChanged i layoutChanged? –

Odpowiedz

5

QPersistentModelIndexes są (wiersz, kolumna, rodzic) odniesienia do przedmiotów, które są automatycznie aktualizowane, gdy użyte elementy są przenoszone do wnętrza modelu, w przeciwieństwie do zwykłej QModelIndex.
Na przykład, jeśli wstawisz jeden wiersz, wszystkie istniejące stałe indeksy umieszczone poniżej punktu wstawiania będą miały o 1 wartość większą niż 1 wstawkę.

Nie możesz ich używać bezpośrednio, ale na przykład QTreeView, aby śledzić rozszerzone elementy i wybrane elementy.

Aby zaktualizować te trwałe indeksy, należy wywoływać funkcje związane z rzeczywistym wstawianiem wierszy podczas dodawania nowych rekordów.

Na końcu odcinka o klasach modelowych subclassing o szczegóły: http://doc.trolltech.com/latest/qabstractitemmodel.html#subclassing

znalazłem tę metodę QAbstractItemModel::persistentIndexList i jestem zastanawiać, co indeksy powinny powrócić. Wszyscy ?
Czy ta metoda powinna zwrócić wszystkie węzły aktualnie widoczne w TreeView?

Metoda zwraca tylko indeksy do którego QPersistentIndexModel powstała i jest nadal w zasięgu (w zmiennej lokalnej, członka klasy, albo w QList<QPersistentIndexModel> na przykład).

Rozszerzone lub wybrane węzły niekoniecznie są obecnie widoczne, więc nie można (i nie powinno się tak) zakładać niczego na temat tego, do czego służą te trwałe indeksy.

Po prostu trzeba zachować je na bieżąco, i trzeba tylko użyć persistentIndexList dla dużych zmian w modelu, jak sortowanie (patrz QTreeWidget wewnętrzny model: QTreeModel::ensureSorted(link)), na mniejszych przyrostowych zmian masz wszystkie beginXxxRows/beginXxxColumns and endXxxRows/endXxxColumns methods.

+0

Dzięki za odpowiedź :) Znalazłem tę metodę QAbstractItemModel :: persistentIndexList i zastanawiam się, jakie indeksy powinien zwrócić. Wszyscy ?? –

+0

Mam na myśli to, że ta metoda zwróci wszystkie węzły aktualnie widoczne w TreeView. Czy istnieje jakaś inna zasada? –

+1

@ David ukończyłem moją odpowiedź, aby odpowiedzieć na twoje pytania. – alexisdm