[gelöst] Programm beendet mit Segmentation Fault

Alles rund um die Programmierung mit Qt
Antworten
msauer75
Beiträge: 6
Registriert: 12. November 2017 08:20

[gelöst] Programm beendet mit Segmentation Fault

Beitrag von msauer75 »

Hallo,

ich bin gerade dabei mein erstes Qt Programm zu schreiben und habe gerade das erste Dialog Feld fertig. Wenn ich den Dialog beendet bekomme ich immer ein Segmentation Fault. Soviel habe ich schon herausgefunden, dass es etwas mit gridLayout zu tun hat. Wo der Fehler genau ist habe ich keine Ahnung. Könnt Ihr mir dabei vielleicht helfen?

mainwindow.cpp:

Code: Alles auswählen

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
    font14pxB.setPixelSize(14);
    font14pxB.setBold(true);
    font9px.setPixelSize(9);

    if (this->objectName().isEmpty())
        this->setObjectName(QStringLiteral("MainWindow"));

    this->resize(800, 480);
    this->setMaximumSize(800, 480);
    this->setMinimumSize(800, 480);

    QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
    this->setSizePolicy(sizePolicy);

    centralWidget = new QWidget(this);
    centralWidget->setObjectName(QStringLiteral("centralwidget"));

    verticalLayoutWidget = new QWidget(centralWidget);
    verticalLayoutWidget->setObjectName(QStringLiteral("verticalLayoutWidget"));
    verticalLayoutWidget->setGeometry(0, 0, 800, 480);

    verticalLayout = new QVBoxLayout(verticalLayoutWidget);
    verticalLayout->setSpacing(5);
    verticalLayout->setObjectName(QStringLiteral("verticalLayout"));

    labelTitel = new QLabel(verticalLayoutWidget);
    labelTitel->setObjectName(QStringLiteral("labelTitel"));
    labelTitel->setFont(font14pxB);
    labelTitel->setAlignment(Qt::AlignCenter);
    labelTitel->setText(QString("Geocache Verwaltung"));
    labelVersion = new QLabel(this);
    labelVersion->setText(QString("(c) by Saver Soft - Sauer, 2017, Version 1.0"));
    labelVersion->setFont(font9px);

    pB_Beenden = new QPushButton(verticalLayoutWidget);
    pB_Beenden->setObjectName(QStringLiteral("pB_Beenden"));
    pB_Beenden->setText(QString("&Beenden"));
    pB_Admin = new QPushButton(verticalLayoutWidget);
    pB_Admin->setObjectName(QStringLiteral("pB_Beenden"));
    pB_Admin->setText(QString("&Admin"));
    pB_GCListe = new QPushButton(verticalLayoutWidget);
    pB_GCListe->setObjectName(QStringLiteral("pB_GCListe"));
    pB_GCListe->setText(QString("GC Liste"));
    pB_Helper = new QPushButton(verticalLayoutWidget);
    pB_Helper->setObjectName(QStringLiteral("pB_Helper"));
    pB_Helper->setText(QString("Hilfstabellen"));
    pB_GCEdit = new QPushButton(verticalLayoutWidget);
    pB_GCEdit->setObjectName(QStringLiteral("pB_GCEdit"));
    pB_GCEdit->setText(QString("GC Bearbeiten"));

    vSp_10 = new QSpacerItem(5, 10, QSizePolicy::Minimum, QSizePolicy::Expanding);
    vSp_20 = new QSpacerItem(5, 20, QSizePolicy::Minimum, QSizePolicy::Expanding);
    vSp_50 = new QSpacerItem(5, 50, QSizePolicy::Minimum, QSizePolicy::Expanding);
    hSp_10 = new QSpacerItem(10, 5, QSizePolicy::Minimum, QSizePolicy::Expanding);
    hSp_20 = new QSpacerItem(20, 5, QSizePolicy::Minimum, QSizePolicy::Expanding);

    gridLayout = new QGridLayout();
    gridLayout->setObjectName(QStringLiteral("gridLayout"));
    gridLayout->addItem(hSp_10, 1, 1, 1, 1);
    gridLayout->addWidget(pB_GCListe, 1, 2, 1, 1);
    gridLayout->addItem(hSp_20, 1, 3, 1, 1);
    gridLayout->addWidget(pB_GCEdit, 1, 4, 1, 1);
    gridLayout->addItem(hSp_20, 1, 5, 1, 3);
    gridLayout->addItem(vSp_10, 2, 1, 1, 7);
    gridLayout->addItem(hSp_10, 3, 1, 1, 1);
    gridLayout->addWidget(pB_Admin, 3, 2, 1, 1);
    gridLayout->addItem(hSp_20, 3, 3, 1, 1);
    gridLayout->addWidget(pB_Helper, 3, 4, 1, 1);
    gridLayout->addItem(hSp_20, 3, 5, 1, 1);
    gridLayout->addWidget(pB_Beenden, 3, 6, 1, 1);
    gridLayout->addItem(hSp_10, 3, 7, 1, 1);
    gridLayout->addItem(hSp_10, 4, 1, 1, 1);
    gridLayout->setRowStretch(4,1);

    verticalLayout->addItem(vSp_10);
    verticalLayout->addWidget(labelTitel);
    verticalLayout->addItem(vSp_50);
    verticalLayout->addLayout(gridLayout);
    verticalLayout->setStretch(3, 1);

    statusBar = new QStatusBar(this);
    statusBar->addPermanentWidget(labelVersion);

    this->setCentralWidget(centralWidget);
    this->setWindowTitle(QString("Geocache Verwaltung"));
    this->setStatusBar(statusBar);

    QObject::connect(pB_Beenden, SIGNAL(clicked(bool)), this, SLOT(close()));
}

MainWindow::~MainWindow()
{
}
main.cpp:

Code: Alles auswählen

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}
Danke Euch für Eure Hilfe.

gruss
martin
Zuletzt geändert von msauer75 am 25. November 2017 09:00, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Programm beendet mit Segmentation Fault

Beitrag von Christian81 »

Du fügst die QSpacerItem mehrmals dem QGridLayout hinzu - das kann nicht funktionieren.
Siehe auch QGridLayout::addItem():
void QGridLayout::addItem(QLayoutItem *item, int row, int column, int rowSpan = 1, int columnSpan = 1, Qt::Alignment alignment = Qt::Alignment())

Adds item at position row, column, spanning rowSpan rows and columnSpan columns, and aligns it according to alignment. If rowSpan and/or columnSpan is -1, then the item will extend to the bottom and/or right edge, respectively. The layout takes ownership of the item.
D.h das QGridLayout löscht beim Beenden seine Items wieder, da Du die Items aber öfter als einmal hinzufügst, wird es auch versucht öfter zu löschen.

Für die UI-Erstellung würde ich generell eher den Qt-Designer benutzen anstatt alles selbst zu programmieren - ist wesentlich einfacher und vor allem nicht so fehleranfällig.

/edit: Die MainWindow.h fehlte übrigens
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
msauer75
Beiträge: 6
Registriert: 12. November 2017 08:20

Re: Programm beendet mit Segmentation Fault

Beitrag von msauer75 »

Danke das hat geholfen.

gruss
martin
Antworten