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

Dlaczego Qt Creator wyrzuca mi wyjątek?

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
263 wizyt
pytanie zadane 20 września 2021 w C i C++ przez tonn204 Mądrala (7,470 p.)

Witam, mam taki kod jak poniżej napisany w bibliotece Qt, język C++. Wszystko działa ta jak chcę , ale w momencie wyłączania programu wyskakuje mi taki wyjątek jak poniżej. Dlaczego tak jest i jak mam to usunąć?

#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QFrame>

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);

    QWidget mainWindow;
    mainWindow.resize(800, 600);

    QHBoxLayout mainLayout;
    mainLayout.setAlignment(Qt::AlignLeft);

    QVBoxLayout buttonsLayou;
    buttonsLayou.setAlignment(Qt::AlignTop);
    buttonsLayou.setContentsMargins(0, 0, 0, 0);

    QFrame frame1(&mainWindow);
    frame1.setObjectName("myObject");
    frame1.setStyleSheet("#myObject { border: 1px solid black; }");
    frame1.setMinimumSize(200, 200);
    mainLayout.addWidget(&frame1);

    QPushButton btn1("One", &frame1);
    QPushButton btn2("Two", &frame1);
    QPushButton btn3("Three", &frame1);
    QPushButton btn4("Four", &frame1);

    btn1.setMinimumSize(200, 40);
    btn2.setMinimumSize(200, 40);
    btn3.setMinimumSize(200, 40);
    btn4.setMinimumSize(200, 40);

    buttonsLayou.addWidget(&btn1);
    buttonsLayou.addWidget(&btn2);
    buttonsLayou.addWidget(&btn3);
    buttonsLayou.addWidget(&btn4);

    frame1.setLayout(&buttonsLayou);

    mainWindow.setLayout(&mainLayout);
    mainWindow.show();
    return app.exec();
}

1 odpowiedź

0 głosów
odpowiedź 20 września 2021 przez tangarr Mędrzec (155,180 p.)

Podczas niszczenia obiektu klasy QObject (z której dziedziczone są wszystkie widgety) niszczone są również wszystkie obiekty przypisane go niego jako obiekty potomne. Jeżeli dziecko obiektu jest obiektem na stosie lub globalnym to może się zdarzyć, że dziecko będzie niszczone dwa razy (double free) co powoduje wykrzaczenie programu.

https://doc.qt.io/qt-5/qobject.html#dtor.QObject
 

Zaalokuj dynamicznie wszytkie obiekty potomne.

#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QFrame>

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);

    QWidget mainWindow;
    mainWindow.resize(800, 600);

    auto mainLayout = new QHBoxLayout();
    mainLayout->setAlignment(Qt::AlignLeft);

    auto buttonsLayou = new QVBoxLayout();
    buttonsLayou->setAlignment(Qt::AlignTop);
    buttonsLayou->setContentsMargins(0, 0, 0, 0);

    auto frame1 = new QFrame(&mainWindow);
    frame1->setObjectName("myObject");
    frame1->setStyleSheet("#myObject { border: 1px solid black; }");
    frame1->setMinimumSize(200, 200);
    mainLayout->addWidget(frame1);

    auto btn1 = new QPushButton("One", frame1);
    auto btn2 = new QPushButton("Two", frame1);
    auto btn3 = new QPushButton("Three", frame1);
    auto btn4 = new QPushButton("Four", frame1);

    btn1->setMinimumSize(200, 40);
    btn2->setMinimumSize(200, 40);
    btn3->setMinimumSize(200, 40);
    btn4->setMinimumSize(200, 40);

    buttonsLayou->addWidget(btn1);
    buttonsLayou->addWidget(btn2);
    buttonsLayou->addWidget(btn3);
    buttonsLayou->addWidget(btn4);

    frame1->setLayout(buttonsLayou);

    mainWindow.setLayout(mainLayout);
    mainWindow.show();
    return app.exec();
}

 

komentarz 20 września 2021 przez tonn204 Mądrala (7,470 p.)
Dzięki za radę, wszystko działa :D!!!

Podobne pytania

0 głosów
1 odpowiedź 1,252 wizyt
pytanie zadane 26 sierpnia 2015 w C i C++ przez Jakub Nowacki Początkujący (470 p.)
0 głosów
0 odpowiedzi 119 wizyt
–1 głos
0 odpowiedzi 321 wizyt
pytanie zadane 23 lipca 2019 w C i C++ przez Ewaryst Ławecki Obywatel (1,710 p.)

93,444 zapytań

142,436 odpowiedzi

322,697 komentarzy

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

...