"undefined reference" bei Beispiel aus Buch

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
MiltenDawn
Beiträge: 16
Registriert: 13. Februar 2007 20:39

"undefined reference" bei Beispiel aus Buch

Beitrag von MiltenDawn »

Hallo Leute! :-)

Ich wollte mal mit der GUI-Programmierung weitermachen und habe mich entschieden, mit Hilfe des Buches "C++ GUI Programming with Qt 4
By Jasmin Blanchette, Mark Summerfield" meine Kenntnisse zu verbessern.
Eines der ersten Beispiele im Buch ist ein "Suchfenster". Den Code habe ich garantiert richtig abgetippt. Hier ist er nochmal zur Kontrolle:

main.cc

Code: Alles auswählen

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

int main(int argc, char *argv[])
{
        QApplication app(argc, argv);

        FindDialog dia1;

        dia1.show();

        return app.exec();
}

FindDialog.h

Code: Alles auswählen

#ifndef FindDialog_H
#define FindDialog_H
#include <QDialog>
class QCheckBox;
class QLabel;
class QLineEdit;
class QPushButton;
class FindDialog : public QDialog
{
     Q_OBJECT
public:
    FindDialog(QWidget *parent = 0);
signals:
    void findNext(const QString &str, Qt::CaseSensitivity cs);
    void findPrevious(const QString &str, Qt::CaseSensitivity cs);
private slots:
    void findClicked();
    void enableFindButton(const QString &text);
private:
    QLabel *label;
    QLineEdit *lineEdit;
    QCheckBox *caseCheckBox;
    QCheckBox *backwardCheckBox;
    QPushButton *findButton;
    QPushButton *closeButton;
};



#endif // FindDialog_H
FindDialog.cpp

Code: Alles auswählen

#include <QtGui>
#include <QDialog>
#include "FindDialog.h"

FindDialog::FindDialog(QWidget *parent):
        QDialog(parent)
{
    label = new QLabel(tr("Find &what:"));
    lineEdit = new QLineEdit;
    label->setBuddy(lineEdit);
    caseCheckBox = new QCheckBox(tr("Match &case"));
    backwardCheckBox = new QCheckBox(tr("Search &backward"));
    findButton = new QPushButton(tr("&Find"));
    findButton->setDefault(true);
    findButton->setEnabled(false);
    closeButton = new QPushButton(tr("Close"));

    connect(lineEdit, SIGNAL(textChanged(const QString &)),
        this, SLOT(enableFindButton(const QString &)));
    connect(findButton, SIGNAL(clicked()),
        this, SLOT(findClicked()));
    connect(closeButton, SIGNAL(clicked()),
        this, SLOT(close()));

    QHBoxLayout *topLeftLayout = new QHBoxLayout;
    topLeftLayout->addWidget(label);
    topLeftLayout->addWidget(lineEdit);
    QVBoxLayout *leftLayout = new QVBoxLayout;
    leftLayout->addLayout(topLeftLayout);
    leftLayout->addWidget(caseCheckBox);
    leftLayout->addWidget(backwardCheckBox);
    QVBoxLayout *rightLayout = new QVBoxLayout;
    rightLayout->addWidget(findButton);
    rightLayout->addWidget(closeButton);
    rightLayout->addStretch();
    QHBoxLayout *mainLayout = new QHBoxLayout;
    mainLayout->addLayout(leftLayout);
    mainLayout->addLayout(rightLayout);
    setLayout(mainLayout);
    setWindowTitle(tr("Find"));
    setFixedHeight(sizeHint().height());
}


Falls es eine Rolle spielt poste ich hier einfach mal die "pro"-Datei:

Code: Alles auswählen

SOURCES += main.cc \
    FindDialog.cpp
HEADERS += FindDialog.h
Wenn ich im Qt-Design jetzt jedoch auf Alles erstellen klicke, erhalte ich folgende Fehler:

Code: Alles auswählen

PFAD/Qt/16-07-09-Practise/debug/moc_FindDialog.cpp:76: undefined reference to `FindDialog::findClicked()'
PFAD/Qt/16-07-09-Practise/debug/moc_FindDialog.cpp:77: undefined reference to `FindDialog::enableFindButton(QString const&)'
:-1: error: collect2: ld returned 1 exit status
In dem Buch steht, dass man eine ähnliche Meldung kriegt, wenn irgendwas mit dem "Moc" nicht stimmt. Ich habe schon diverse Male QMake neu aufgerufen (rechte Maustaste auf Projekt-> qmake ausführen) oder das Projekt bereinigt. Alles war bis jetzt erfolglos.

Woran könnte das liegen, und was soll ich machen?


Vielen Dank für eure Hilfe!
Gruß,
Milten
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Und wo sind die beiden Funktionen die der Linker anmeckert implementiert?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
MiltenDawn
Beiträge: 16
Registriert: 13. Februar 2007 20:39

Beitrag von MiltenDawn »

Danke für die schnelle Antwort,, Christian81!

Du hast Recht! Das ist in der Tat das Problem gewesen.
Ich hab die FindDialog.cpp um folgende Zeilen ergänzt:
void FindDialog::findClicked()
{
//TO DO
}
void FindDialog::enableFindButton(const QString &text)
{
//TO DO
}

und es funktioniert tatsächlich.

Damit ist das Thema wohl erledigt - Thread kann gelöscht werden.

Vielen Dank nochmal!

PS: Ist mir jetzt ein bisschen peinlich, aber irgendwie war es in dem Buch auch ziemlich missverständlich dargestellt. So wie ich das sehe, sollte man das zwischendurch ohne weiteres kompilieren können. Die Implementierung der Funktionen folgt nämlich erst 4! Seiten weiter...
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

Beitrag von Mani99 »

Das ist jetzt zwar extrem off-topic, aber warum kommen immer wieder leute auf die idee, wenn ein problem gelöst wurde, das der thread gelöscht werden kann?
Antworten