2010-03-03 17 views
5

Przepraszamy za głupie pytanie, ale pracuję z Qt i C++ po raz pierwszy i pracuję nad samouczkiem i próbkami.Zarządzanie pamięcią dla kolekcji widżetów w Qt

Jedna rzecz, którą wspomniano, to że rzeczy Qt nie muszą być jawnie usunięte. Tak więc, główne pytanie, dotyczy to również zbiorów rzeczy Qt? Tak jak na przykład chcę dynamicznej liczby MyWidget s, więc zachowam vector lub cokolwiek z nich. Nadal się nimi zajmują?

Jako pytanie uboczne, co się dzieje, aby nie musiałem się martwić o destruktory?

Odpowiedz

5

Qt ma na pewno interesujący model obiektu. Kiedy zaczynałem, niepokoiło mnie, że było tak wiele połączeń new Foo i nie było ich.

http://qt.nokia.com/doc/4.6/object.html Jest dobrym miejscem do rozpoczęcia czytania na modelu obiektowym.

Ciekawostki: Podklasy QObject mają przypisane swoje metody i metody copy-ctor wyłączone. Łańcuch obiektów child-parents jest utrzymywany wewnętrznie przez QObject.

Generalnie podczas tworzenia podklasy QObject (jeśli nie planujesz samodzielnie zarządzać wskaźnikiem), wskażesz inny wskaźnik QObject jako obiekt nadrzędny. Ten "rodzic" następnie przejmuje zarządzanie dzieckiem, które właśnie zrobiłeś. Możesz wywołać metodę setParent() na obiekcie QObject, aby zmienić, kto jest jego właścicielem. W Qt istnieje bardzo niewiele metod, które zmieniają obiekt macierzysty obiektu i wszystkie wyraźnie stwierdzają, że robią to w dokumentach.

Aby odpowiedzieć na konkretne pytanie: zależy to od sposobu utworzenia wszystkich instancji MyWidget.

Jeśli zrobiłeś je z rodzicem, to nie, nie musisz ich usuwać. Rodzic usunie je po usunięciu.

Jeśli przechowujesz ich kolekcję QList<MyWidget*>, a nie dałeś im rodzica, powinieneś je usunąć samodzielnie.

7

Model zarządzania pamięcią Qt oparty jest na relacji rodzic-dziecko. Klasy Qt przyjmują opcjonalny parent jako parametr swojego konstruktora. Nowa instancja rejestruje się z tym elementem nadrzędnym, tak że jest usuwana po usunięciu elementu nadrzędnego. Jeśli korzystasz z kolekcji Qt (na przykład QList), wierzę, że możesz ustawić listę jako nadrzędną dla jej wpisów. Jeśli używasz std :: vector lub innego typu kolekcji, nie otrzymasz "automatycznego" zarządzania pamięcią.

Model Qt ma wiele sensu w hierarchii UI, gdzie dopasowuje się jeden do jednego z hierarchią UI. W innych przypadkach nie zawsze mapuje się tak czysto i trzeba ocenić, czy korzystanie z systemu Qt ma sens w konkretnej sytuacji. Normalne narzędzia C++ nadal działają: możesz użyć std :: tr1 :: shared_ptr lub dowolnej z innych klas inteligentnych wskaźników, aby pomóc w zarządzaniu czasem życia obiektu. Qt zawiera także QPointer, strzeżony wskaźnik i parę QSharedPointer/QWeakPointer, które implementują inteligentny wskaźnik referencji i parę słabych referencji.

+2

Nie można ustawić kolekcji Qt jako elementu nadrzędnego obiektu. Obiekty, które są przydzielane dynamicznie i mają relacje rodzic-dziecko, są obiektami obiektu QObject i pobierają podklasy QObjects/QWidgets jako obiekty nadrzędne. QList i inne klasy kolekcji nie dziedziczą z QWidget (i przez rozszerzenie QObject), więc nie można ustawić go jako rodzica. – blwy10