• 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?

Cloud VPS
0 głosów
268 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,254 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 327 wizyt
pytanie zadane 23 lipca 2019 w C i C++ przez Ewaryst Ławecki Obywatel (1,710 p.)

93,460 zapytań

142,454 odpowiedzi

322,724 komentarzy

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

Kursy INF.02 i INF.03
...