• 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
223 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 503 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,666 zapytań

141,564 odpowiedzi

320,020 komentarzy

62,032 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

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!

...