Seite 1 von 1

"undefined reference" bei Beispiel aus Buch

Verfasst: 22. Juli 2009 14:31
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

Verfasst: 22. Juli 2009 14:52
von Christian81
Und wo sind die beiden Funktionen die der Linker anmeckert implementiert?

Verfasst: 22. Juli 2009 15:02
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...

Verfasst: 22. Juli 2009 15:18
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?