リンクエラー

もう朝からエラー出まくりで逆に楽しいですな。今だけだろうと思うけどww

次のQDialogを継承したオブジェクトの生成で、リンクエラーが発生(リンカエラー??)
ぐぐってみたら、MLのアーカイブが釣れたので見てみると、mocを実行しなあかんとか。mocっちゅうのはメタオブジェクトコンパイラ。たぶんヘッダファイルで使われているマクロを適当に展開してくれるんじゃないかと思うけど、詳しくはしらぬ。

でも本よく読んでみたら、mocを実行しなあかんねんけどその為にはqmakeを再度実行せなあかんでーって書いてある。んで、qmake実行してみたけどなんも変わらんようだ。なんだかなー。
またお手上げ状態。エラーの解決に1日かけてる場合じゃないぞー!!

[追記] ファイル名に問題があるんじゃないかと思って、ファイル名をクラス名を小文字にしたものに変更し、qmakeが自動生成したファイルを全部消去して、再度コンパイルしなおしたらなんとかコンパイル通った。


正常に実行できたし。これでまた先へ進めますじゃ。
それにしても、本の通りにしなかった為にエラーが発生するというのは、さすが、固いシステムというか。。
ちなみに、これは機能的な実装はなにもないです。GUIだけ。
QtDesignerというアプリがインストールされるけども、手で書いてみようよていうQt4本の例。
JavascriptでDom使ってForm生成したりしてるのと同じような感じだよね。
以下ソース注意
finddialog.h

// 定義されていなければ、定義を行う
#ifndef FINDDIALOG_H
#define FINDDIALOG_H

#include <QDialog>

class QCheckBox;
class QLabel;
class QLineEdit;
class QPushButton;

class FindDialog : public QDialog
{
  // Q_OBJECTマクロを実行する
  Q_OBJECT;
public:
  // デフォルトで0(NULL)を渡している。これは親を持たないことを意味する
  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.cpp

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

FindDialog::FindDialog(QWidget *parent)
  : QDialog(parent)
{
  label = new QLabel(tr("Find &what:"));
  lineEdit = new QLineEdit;
  // 兄弟widget を登録。 labelへのフォーカスが発生するとlineEditのフォーカスに変わる
  label->setBuddy(lineEdit);
  // tr は 翻訳可能な文字列を示す。文字列中の&は、キーボードショートカットに割り当てられるらしいが、、、
  caseCheckBox = new QCheckBox(tr("Match &case"));
  backwardCheckBox = new QCheckBox(tr("Search &backward"));
  
  findButton = new QPushButton(tr("&Find"));
  // setDefault => このアプリ上でEnterを押したらfindButtonのclickシグナル発生
  findButton->setDefault(true);
  findButton->setEnabled(false);
  closeButton = new QPushButton(tr("close"));
  
  //lineEdit の textChangedを受けとったら disabledにされていた findButtonをenabledにする
  // const QString & ってどういう意味だろう、、、? 型を書いてるだけなのかな。
  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"));
  // sizeHint => QWidget::sizeHint 理想的なサイズを返す
  setFixedHeight(sizeHint().height());
}

void FindDialog::findClicked()
{
  QString text = lineEdit->text();
  Qt::CaseSensitivity cs = caseCheckBox->isChecked() ? Qt::CaseSensitive : Qt::CaseInsensitive;
  // emit はまだ意味わからん、、、
  if(backwardCheckBox->isChecked()){
    emit findPrevious(text,cs);
  }else{
    emit findNext(text,cs);
  }
}

void FindDialog::enableFindButton(const QString &text)
{
  findButton->setEnabled(!text.isEmpty());
}