Seite 1 von 1

[gelöst] Programm beendet mit Segmentation Fault

Verfasst: 12. November 2017 08:25
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

Re: Programm beendet mit Segmentation Fault

Verfasst: 12. November 2017 19:22
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

Re: Programm beendet mit Segmentation Fault

Verfasst: 25. November 2017 09:00
von msauer75
Danke das hat geholfen.

gruss
martin