2012-01-04 2 views
5

나는 그 구현이이 FindAndReplaceBar라는 클래스를 가지고 :다중 정의 오류 : 하나는 파일에, 다른 하나는 moc 파일에 있습니다.

#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); 
} 

나는 기능의 여러 정의의 문제 얻을 프로그램을 실행하면 :

findNext(), findPrevious(), replace(), replaceAll()을.

다른 정의는 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

관련 문제