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

0 głosów
377 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,140 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,337 wizyt
pytanie zadane 26 sierpnia 2015 w C i C++ przez Jakub Nowacki Początkujący (470 p.)
0 głosów
0 odpowiedzi 167 wizyt
–1 głos
0 odpowiedzi 449 wizyt
pytanie zadane 23 lipca 2019 w C i C++ przez Ewaryst Ławecki Obywatel (1,710 p.)

93,754 zapytań

142,714 odpowiedzi

323,359 komentarzy

63,348 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.

...