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

Alles rund um die Programmierung mit Qt
Antworten
RogerWilco
Beiträge: 61
Registriert: 26. November 2009 00:08
Kontaktdaten:

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

Beitrag 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();
}
Zuletzt geändert von RogerWilco am 26. Juni 2011 19:42, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Minimal kompilierbares Beispiel bitte.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
RogerWilco
Beiträge: 61
Registriert: 26. November 2009 00:08
Kontaktdaten:

Beitrag 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();
}
Antworten