• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Qt Creator - QPushButton

Object Storage Arubacloud
+2 głosów
1,182 wizyt
pytanie zadane 28 kwietnia 2015 w C i C++ przez niezalogowany
Zaczynam swą przygodę z biblioteką Qt. Widać, że jest o wiele lepszy od C++ Builder, więc od razu zachęcam do przesiadki tych, którzy się nudzą ;) Żeby czegoś nauczyć, to nie szukajcie tutoriali na YT, tylko w oficjalnej dokumentacji Qt i Qt Wiki. Ale do rzeczy: przycisk w Qt można zadeklarować na dwa sposoby, czyli QPushButton przycisk("Napis"); lub QPushButton *przycisk=new QPushButton("Napis",this); I teraz pytanie: na co dwie formy deklarowania? Wiem (oczywiście z kursów OC++ Pana Zet), że chyba to jest wskaźnik polimorficzny, dzięki któremu deklaruje się go dynamicznie, czyli można usunąć to na co wskazuje i zwalnia pamięć RAM, dzięki czemu program jest płynniejszy na przykład. Ale kiedy zwalnia pamięć (jeśli rzeczywiście tak jest)? Po wyłączeniu programu? Tak jest przecież zawsze! No i chciałbym się dowiedzieć :| Dziękuję za odpowiedzi, szczególnie od wprawnych Qt Creatorów ;)

2 odpowiedzi

0 głosów
odpowiedź 28 kwietnia 2015 przez Bondrusiek Maniak (61,370 p.)
wybrane 29 kwietnia 2015
 
Najlepsza
  • Jeżeli pracujemy w konstruktorze, tworzymy obiekt dynamicznie (na stercie) za pomocą słowa new. Co prawda, obiekty tworzone dynamicznie należy usuwać za pomocą delete, ale w tym wypadku nie jest to konieczne (destruktor usuwa wszystkie obiekty umieszczone na formatce widgetu glównego).Przykład:

          plik.h

          QPushButton *button;

           plik.cpp // w konstruktorze

          button = new QPushButton;

  • Jeżeli chcemy obiekt zbudować poza konstruktorem (w funkcji), tworzymy go zwyczajnie, bez słowa new. Nie trzeba wówczas lokalizować pamięci wewnątrz pliku *.h. Jako że będzie to obiekt rzeczywisty, niebędący wskaźnikiem, dostęp do wbudowanych metod uzyskamy przez znak kropki (.).

Co do różnicy pomiędzy QPushButton przycisk("Napis"); a QPushButton przycisk("Napis",this); to pierwsza klasa tworzy widget osamotniony bez rodzica ,który jak go wywołamy metodą  przycisk.show() będzie luźno na ekranie. W drugiej metodzie podaliśmy już rodzica this (this jest wskaźnikiem na obiekt-może to być QWidget, QToolButton etc) i aby zobatrzyć przycisk musimy najpierw wywołać rodzica.

 

      

 

komentarz 29 kwietnia 2015 przez niezalogowany
Dzięki, wszystko ładnie wytłumaczone, nawet to co już wiedziałem (o parentach), ale jeszcze raz: jeśli dobrze zrozumiałem, to np. QPushButton deklaruje się w formie wskaźnika wtedy, gdy jest on w innym Widgetcie np. QPush...=new QPushButton("",&window), lub gdy jest wpisywany w konstruktorze np. Window::Window(...)? Pewnie dobrze już rozumiem, ale chciałbym jeszcze zapytać, czy ten zapis wskaźnikowy chociaź odrobinkę optymalizuje kod?
komentarz 29 kwietnia 2015 przez Bondrusiek Maniak (61,370 p.)
Mniej więcej tak. Zasada jest taka, że w konstruktorach(widgetach) lepiej jest działać na wskaźnikach a w innych możliwościach na obiektach.
komentarz 29 kwietnia 2015 przez niezalogowany
Aha, to dzięki, raczej już wszystko rozumiem ;)
0 głosów
odpowiedź 28 kwietnia 2015 przez MoWerr Obywatel (1,940 p.)
W C++ musisz sam pilnować zwalniania pamięci przez słowo kluczowe "delete".  (Chodzi o to, że jeśli wskaźnik zacznie wskazywać na inny obiekt lub wyjdzie z zakresu i nie będziemy mogli dostać się do zaalokowanej wcześniej pamięci to mamy tzw. wyciek. Kiedy nasz program będzie miał wiele wycieków to możliwym jest, że w końcu zapchamy całą pamięć RAM i program się wysypie (raczej przy dużych programach i długim ich działaniu)
 
Czyli, aby zwolnić pamięć po przycisku, na który wskazuje dany wskaźnik, wpisujesz "delete przycisk;"

Więcej o dynamicznym alokowaniu pamięci:
http://cpp0x.pl/kursy/Kurs-C++/Dynamiczne-zarzadzanie-pamiecia-new-i-delete/307
komentarz 29 kwietnia 2015 przez niezalogowany
No to wiem, ale nie wiem czy ty wiesz coś na temat Qt Creator. To co napisałeś jest standardowe w proceduralnym C++ z odcinka 10. (wskaźniki) u Pana Zet. Mimo wszystko dzięki za odpowiedź ;)

Podobne pytania

0 głosów
1 odpowiedź 250 wizyt
pytanie zadane 20 lipca 2019 w C i C++ przez Ewaryst Ławecki Obywatel (1,710 p.)
0 głosów
0 odpowiedzi 265 wizyt
pytanie zadane 31 maja 2018 w C i C++ przez maszaczek Nowicjusz (230 p.)
0 głosów
1 odpowiedź 348 wizyt

92,580 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,965 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...