2012-01-04 27 views
5

私は、その実装これですFindAndReplaceBarというクラス、持っている:複数の定義エラー:ファイルに1つ、mocファイルに1つ。

findNext()findPrevious()replace()replaceAll():私は関数の複数の定義の問題を取得するプログラムを実行すると

#include "FindAndReplaceBar.h" 
#include <QLabel> 
#include <QPushButton> 
#include <QGridLayout> 
#include <QTextDocument> 
#include <QLineEdit> 

FindAndReplaceBar::FindAndReplaceBar(QObject *parent) : 
    QToolBar(NULL) 
{ 
    lblFind   = new QLabel("Find: ",this); 
    lblReplace  = new QLabel("Replace",this); 

    ledtFind  = new QLineEdit(this); 
    ledtReplace  = new QLineEdit(this); 

    QPixmap next(":/res/resources/next.gif"); 
    QPixmap previous(":/res/resources/previous.gif"); 
    QPixmap close(":/res/resources/close_icon.gif"); 

    btnFindNext  = new QPushButton(QIcon(next),"",this); 
    btnFindPrevious = new QPushButton(QIcon(previous),"",this); 
    btnClose  = new QPushButton(QIcon(close),"",this); 

    btnReplace  = new QPushButton("Replace",this); 
    btnReplaceAll = new QPushButton("Replace All",this); 

    btnFindNext->setFlat(true); 
    btnFindPrevious->setFlat(true); 
    btnClose->setFlat(true); 
    btnReplace->setFlat(true); 
    btnReplaceAll->setFlat(true); 

    lytFindAndReplaceBar  = new QGridLayout(this); 

    lytFindAndReplaceBar->addWidget(lblFind,0,0,1,1); 
    lytFindAndReplaceBar->addWidget(ledtFind,0,1,1,2); 
    lytFindAndReplaceBar->addWidget(btnFindPrevious,0,3,1,1); 
    lytFindAndReplaceBar->addWidget(btnFindNext,0,4,1,1); 

    lytFindAndReplaceBar->addWidget(lblReplace,0,5,1,1); 
    lytFindAndReplaceBar->addWidget(ledtReplace,0,6,1,2); 
    lytFindAndReplaceBar->addWidget(btnReplace,0,8,1,1); 
    lytFindAndReplaceBar->addWidget(btnReplaceAll,0,9,1,1); 

    this->setLayout(lytFindAndReplaceBar); 

    connect(btnFindNext,SIGNAL(clicked()),this,SIGNAL(findNext())); 
    connect(btnFindPrevious,SIGNAL(pressed()),this,SIGNAL(findPrevious())); 
    connect(btnClose,SIGNAL(pressed()),this,SLOT(close())); 
    connect(btnReplace,SIGNAL(pressed()),this,SIGNAL(replace())); 
    connect(btnReplaceAll,SIGNAL(pressed()),this,SIGNAL(replaceAll())); 

    this->setStyleSheet("QToolBar{background: qlineargradient(x1:0,x2:0,y1:0,y2:1,stop:0 #fffaf0,stop:0.3 #fdf5e6)} QLineEdit{border-radius:4px;padding:2px;}"); 
} 

void FindAndReplaceBar::findNext() 
{ 
    emit find(0); 
} 

void FindAndReplaceBar::findPrevious() 
{ 
    emit find(QTextDocument::FindBackward); 
} 

void FindAndReplaceBar::replace() 
{ 
    emit replace(false); 
} 

void FindAndReplaceBar::replaceAll() 
{ 
    emit replace(true); 
} 

QString FindAndReplaceBar::searchTerm() 
{ 
    return this->ledtFind->text(); 
} 

QString FindAndReplaceBar::replaceTerm() 
{ 
    return this->ledtReplace->text(); 
} 

void FindAndReplaceBar::setSearchFieldText(const QString & searchFieldText) 
{ 
    this->ledtFind->setText(searchFieldText); 
} 

void FindAndReplaceBar::setReplaceFieldText(const QString & replaceFieldText) 
{ 
    this->ledtReplace->setText(replaceFieldText); 
} 

を。

他の定義はmoc_FindAndReplaceBar.cppファイルで作られています。 私はそれを修正する方法がわからないので、どのような問題がわからない!私は本当に助けていただきありがとうございます!

+0

上のQtのドキュメントから

はフル、クリーンビルドを行うようにしてください。時々物事は同期していない。 – Mat

+0

しました。 moc_FindAndReplaceBarが削除されたダイアログが表示され、別の名前で保存したいと思います。私はそれが大きな問題を作成するかもしれないので、名前を変更すると思ったので、私はちょうど '保存'をクリックした –

+0

あなたのビルドシステムが混乱しているように見えます。 mocファイルを再生成するために削除します。 – Mat

答えて

11

私たちはあなたのヘッダファイルを見れば、あなたは信号を実装していなければなりませんfindNext(), findPrevious(), replace(), replaceAll()などの信号を宣言しますが、しているだろう、私は仮定し、あなたの接続コール(合図する信号)から判断する - 彼らはただ宣言する必要がありますヘッダーにsignals

Signals are automatically generated by the moc and must not be implemented in the .cpp file. They can never have return types (i.e. use void).

+0

それはまさに私がやったことです。ありがとう、私はここからそれを取ることができます:) –

+0

私はちょうどこれにも遭遇しました。信号を最初に宣言した後、別のクラスにコピー&ペーストして、信号をスロットに変更するのを忘れると、簡単に間違います:) – anr78

関連する問題