Seite 1 von 1

[gelöst] Address Book Tutorial führt zu Segmentation Fault

Verfasst: 26. Juni 2011 14:00
von RogerWilco
Hallo zusammen,

ich versuche gerade das Tutorial nachzuvollziehen.
Ich bin am Ende von Kapitel 2.
Beim Ausführen kommt es aber schon zu einem "Segmentation Fault" an der Stelle:

Code: Alles auswählen

 nameLine->setReadOnly(true);
(die Stelle ist unten im Quellcode von addressbook.cpp mit einem Kommentar markiert)

Ich habe den Text im Qt Assustant mit meinem verglichen und komme dem Problem nicht auf die Spur.
Kommentiere ich die Zeile aus, führt die nächste Zeile
QLabel *addressLabel = new QLabel(tr("Address:"));
ebenfalls zum Segmentation Fault.

Vielleicht kann mir jemand dabei Helfen.
Nach einer Pause ist das Tutorial eigenltich eine gute Hilfe.
Vielen Dank!


addressbook.h

Code: Alles auswählen

#ifndef ADDRESSBOOK_H
#define ADDRESSBOOK_H

#include <QWidget>
#include <QMap>

class QLabel;
class QLineEdit;
class QTextEdit;
class QPushButton;




class addressbook : public QWidget
{
    Q_OBJECT
public:
    explicit addressbook(QWidget *parent = 0);

signals:

public slots:
    void addContact();
    void submitContact();
    void cancel();


private:
    QPushButton *addButton;
    QPushButton *submitButton;
    QPushButton *cancelButton;

    QLineEdit *nameLine;
    QTextEdit *addressText;

    QMap<QString, QString> contacts;
    QString oldName;
    QString oldAddress;


};

#endif // ADDRESSBOOK_H
addressbook.cpp

Code: Alles auswählen

#include <QtGui>
#include "addressbook.h"

addressbook::addressbook(QWidget *parent) :
    QWidget(parent)
{
    QLabel *nameLabel = new QLabel(tr("Name:"));
    nameLine = new QLineEdit;
    nameLine->setReadOnly(true);                                               //[b]Segmentation Fault [/b]

    QLabel *addressLabel = new QLabel(tr("Address:"));
    addressText = new QTextEdit;
    addressText->setReadOnly(true);

    addButton = new QPushButton(tr("&Add"));
    addButton->show();
    submitButton = new QPushButton(tr("&Submit"));
    submitButton->hide();
    cancelButton = new QPushButton(tr("&Cancel"));
    cancelButton->hide();

    connect (addButton, SIGNAL(clicked()), this, SLOT(addContact()));
    connect (submitButton, SIGNAL(clicked()), this, SLOT(submitContact()));
    connect (cancelButton, SIGNAL(clicked()), this, SLOT(cancel()));


    QVBoxLayout *buttonLayout1 = new QVBoxLayout;
    buttonLayout1->addWidget(addButton, Qt::AlignTop);
    buttonLayout1->addWidget(submitButton);
    buttonLayout1->addWidget(cancelButton);
    buttonLayout1->addStretch();

    QGridLayout *mainLayout = new QGridLayout;
    mainLayout->addWidget(nameLabel, 0, 0);
    mainLayout->addWidget(nameLine, 0, 1);
    mainLayout->addWidget(addressLabel, 1, 0, Qt::AlignTop);
    mainLayout->addWidget(addressText, 1, 1);
    mainLayout->addLayout(buttonLayout1, 1, 2);

    setLayout(mainLayout);
    setWindowTitle(tr("Simple Address Book"));



}



void addressbook::addContact()
{
    oldName = nameLine->text();
    oldAddress = addressText->toPlainText();

    nameLine->clear();
    addressText->clear();

    nameLine->setReadOnly(false);
    nameLine->setFocus(Qt::OtherFocusReason);
    addressText->setReadOnly(false);
    submitButton->show();
    cancelButton->show();
}


void addressbook::submitContact()
{
    QString name = nameLine->text();
    QString address = addressText->toPlainText();

    if (name.isEmpty() || address.isEmpty()) {
        QMessageBox::information(this, tr("Empty Field"), tr("Please enter a name and address."));
        return;
    }

    if (!contacts.contains(name)) {
        contacts.insert(name, address);
        QMessageBox::information(this, tr("Add Successful"), tr("\"%1\" has been added to your address book.").arg(name));
    } else {
        QMessageBox::information(this, tr("Add Unsuccessful"), tr ("Sorry, \"%1\" is already in your address book.").arg(name));
        return;
    }

    if (contacts.isEmpty()) {
        nameLine->clear();
        addressText->clear();
    }
    nameLine->setReadOnly(true);
    addressText->setReadOnly(true);
    addButton->setEnabled(true);
    submitButton->hide();
    cancelButton->hide();
}


void addressbook::cancel()
{
    nameLine->setText(oldName);
    nameLine->setReadOnly(true);

    addButton->setEnabled(true);
    submitButton->hide();
    cancelButton->hide();
}

Verfasst: 26. Juni 2011 17:01
von Christian81
Minimal kompilierbares Beispiel bitte.

Verfasst: 26. Juni 2011 19:41
von RogerWilco
Hallo,

der Fehler war, daß ich Vorlage einfach ein Projekt für eine Application mit einem MainWindow verwendet habe.

Nach Auskommentieren der include Anweisung für das Mainwindow lief es problemlos.
Ich hätte eigentlich nicht damit gerechnet, dass die #include-Anweisung ein Problem sein könnte, da nichts mehr damit gemacht wird...

Code: Alles auswählen

#include <QtGui/QApplication>
//#include "mainwindow.h"
#include "addressbook.h"

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

    return a.exec();
}