2

In the book "C++ GUI Programming with Qt 4" there's a FindDialog Widget example show step by step in Part 1, Chapter 2, now I'm trying to build this example using the Makefile generated by qmake but it complains saying:

g++ -Wl,-O1 -o Hello hello.o    -L/usr/lib/i386-linux-gnu -lQtGui -lQtCore -lpthread 
hello.o: In function `main':
hello.cpp:(.text.startup+0x47): undefined reference to `FindDialog::FindDialog(QWidget*)'
collect2: ld returned 1 exit status
make: *** [Hello] Error 1

Using the shell command prompt (on Linux Mint) I've created a directory Hello I've created a project file (with qmake) Hello.pro This is the ls command output in /Hello:

FindDialog.cpp  FindDialog.h  hello.cpp  hello.o  Hello.pro  Makefile

I've been trying to figure out the problem for 2 hours now, I would be very grateful of any help thank you.

This is the file containing main :

#include "FindDialog.h"

int main(int argc, char *argv[])
 {
 QApplication app(argc, argv);
 FindDialog *dialog = new FindDialog();
 dialog->show();
 return app.exec();
 }

Header file: FindDialog.h

#ifndef FIND_DIALOG_H
#define FIND_DIALOG_H
#include <QDialog>
class QCheckBox;
class QLabel;
class QLineEdit;
class QPushButton;

class FindDialog : public QDialog
{
  Q_OBJECT

  public:
   FindDialog(QWidget* parent = 0);
   ~FindDialog();
   signals:
   void findNext(const QString &str, Qt::CaseSensitivity cs);
   void findPrevious(const QString &str, Qt::CaseSensitivity cs);
  private slots:
   void findClicked();
   void enableFindFunction(const QString &text);
  private:
   QLabel *label;
   QLineEdit *lineEdit;
   QCheckBox *caseCheckBox;
   QCheckBox *backwardCheckBox;
   QPushButton *findButton;
   QPushButton *closeButton;
};

#endif

Implementation File: FindDialog.cpp

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

FindDialog::FindDialog(QWidget *parent = 0):QDialog(parent)
{
   //Creating components
   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"));
   //adding event handling
   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()));
   //setting layout
   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);
   //window title
   setWindowTitle(tr("Find"));
   setFixedHeight(sizeHint().height());
  }
 FindDialog::~FindDialog(){
 }
 void FindDialog::findClicked()
 {
   QString text = lineEdit->text();
   Qt::CaseSensitivity cs = caseCheckBox->isChecked() ? Qt::CaseSensitive : Qt::CaseInsensitive;
   if (backwardCheckBox->isChecked()) {
      emit findPrevious(text, cs);
   }
   else {
      emit findNext(text, cs);
   }
  }
  void FindDialog::enableFindButton(const QString &text)
  {
    findButton->setEnabled(!text.isEmpty());
  }
eightShirt
  • 1,387
  • 2
  • 14
  • 27
Chedy2149
  • 2,501
  • 3
  • 30
  • 52

1 Answers1

2

Lol4t0's answer solved your problem. You have just to rerun qmake -project.

tro
  • 6,473
  • 6
  • 46
  • 65