• 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

0 głosów
574 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,460 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,460 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 405 wizyt
pytanie zadane 23 sierpnia 2016 w C i C++ przez manjaro Nałogowiec (37,420 p.)
0 głosów
2 odpowiedzi 734 wizyt
pytanie zadane 3 grudnia 2016 w C i C++ przez MatrixBMW Początkujący (360 p.)
0 głosów
0 odpowiedzi 247 wizyt

93,742 zapytań

142,678 odpowiedzi

323,297 komentarzy

63,326 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...