在“使用Qt 4进行C++ GUI编程”一书中,第1部分第2章逐步演示了FindDialog Widget示例,现在我正尝试使用由qmake生成的Makefile构建该示例,但它抱怨说:

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

使用shell命令提示符(在Linux Mint上)
我已经创建了一个目录Hello
我已经使用qmake创建了一个项目文件Hello.pro
这是/ Hello中的ls命令输出:
FindDialog.cpp  FindDialog.h  hello.cpp  hello.o  Hello.pro  Makefile

我已经尝试找出问题两个小时了,非常感谢您的帮助。

这是包含main的文件:
#include "FindDialog.h"

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

头文件: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

实现文件: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());
  }

最佳答案

Lol4t0的答案解决了您的问题。
您只需要重新运行qmake -project即可。

09-06 04:22