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

Okno aplikacji QT nie odświeża się prawidłowo

Object Storage Arubacloud
0 głosów
221 wizyt
pytanie zadane 26 czerwca 2021 w C i C++ przez Alkaratus Nowicjusz (160 p.)

W swojej aplikacji próbuję zastosować dynamiczne usuwanie i dodawanie obiektów Qt w trakcie działania. Jednak po usunięciu nieużywanych obiektów (przez operator delete oraz usunięcie wskaźników na nie z Vectora w mainwindow), i dodaniu nowych w ich miejsce (przez operator new oraz dodanie wskaźników do Vectora w mainwindow), elementy zostają usunięte i przestają być widoczne, to pomimo użycia funkcji update lub repaint, nowe obiekty nie pojawiają się na ekranie (mimo że są oznaczone jako dzieci mainwindow). Na innych forach i w dokumentacji nie byłem w stanie znaleźć rozwiązania.

Tak wygląda kod funkcji która ma dokonać modyfikacji elementów 

void game_menu(MainWindow *window){
    window->delete_elements();
    create_game_menu(window);
    window->update();
}

Funkcja odpowiedzialna za usunięcie elementów z vectora Mainwindow:

void MainWindow::delete_elements(){
    for (unsigned int i=0; i<elements.size();i++){
        delete elements[i];
    }
    elements.clear();
}

Oraz funkcja która dodaje elementy do Vectora mainwidnow:

void create_game_menu(MainWindow *window){
    //Tworzy elementy menu gry


    QLabel *content=new QLabel(window);
    content->setGeometry(50,300,300,100);
    window->add_element(content);
    window->mark_content(content);

    Menu_Label *game, *host_game, *main_menu;
    game= new Menu_Label(window,"Stwórz grę",content,"Utwórz grę z komputerem-hostem",start_game);
    game->setGeometry(20, 40, 100, 20);
    window->add_element(game);

    host_game= new Menu_Label(window,"Graj",content,"Stwórz grę gdzie gracz jest hostem",start_host_game);
    host_game->setGeometry(20, 80, 100, 20);
    window->add_element(host_game);

    main_menu= new Menu_Label(window,"Powrót",content,"Powrót do menu głównego",back_to_menu);
    main_menu->setGeometry(20, 120, 100, 20);
    window->add_element(main_menu);

}

Nie mam zbyt dużego doświadczenia w Qt, więc być może to jakieś trywialne błędy, ale nie jestem w stanie ich wychwycić. Prosiłbym o pomoc i wyjaśnienie

1 odpowiedź

0 głosów
odpowiedź 28 czerwca 2021 przez Bondrusiek Maniak (61,410 p.)

Cześć,

jeśli chodzi o usuwanie elementów to spróbuj użyć funkcji qDeleteAll(). W Qt jeśli usuniesz element to automatycznie usuwane są przypisane dzieci:

void MainWindow::delete_elements(){
    qDeleteAll(elements);
    elements.clear();
}

Co do dodawanie elementów do widżetów to wszystko wydaje się OK. Ewentualnie wrzuć więcej kodu to można będzie coś wymyślić.

komentarz 3 lipca 2021 przez Alkaratus Nowicjusz (160 p.)

Możliwe że jeszcze jakiś błąd jest w funkcji dodającej adresy do wektora

void MainWindow::add_element(QWidget *element){

   elements.push_back(element);

}

 

komentarz 4 lipca 2021 przez Bondrusiek Maniak (61,410 p.)
Wydaje się że to jest Ok. W Qt rodzic zarządza dziećmi więc jeśli je gdzieś dodajesz lub usuwasz widgety to nie musisz się przejmować wyciekami pamięci. Pokaż więcej kodu to spróbuje odtworzyć Twój kod.

Podobne pytania

+1 głos
0 odpowiedzi 291 wizyt
pytanie zadane 23 sierpnia 2016 w C i C++ przez manjaro Nałogowiec (37,390 p.)
0 głosów
2 odpowiedzi 501 wizyt
pytanie zadane 3 grudnia 2016 w C i C++ przez MatrixBMW Początkujący (360 p.)
0 głosów
0 odpowiedzi 159 wizyt

92,661 zapytań

141,554 odpowiedzi

319,995 komentarzy

62,028 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!

...