2012-01-04 5 views
5

tengo una clase llamada FindAndReplaceBar, cuya aplicación es la siguiente:Error de definiciones múltiples: uno en mi archivo y otro en el archivo 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); 
} 

Cuando ejecuto el programa consigo problemas de múltiples definiciones de las funciones:

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

La otra definición se realiza en el archivo moc_FindAndReplaceBar.cpp. ¡No estoy seguro de cuál es el problema, así que no sé cómo solucionarlo! Realmente agradecería cualquier ayuda, ¡gracias!

+0

tratar de hacer una investigación completa, generación limpia. A veces las cosas se salen de sincronía. – Mat

+0

Lo hice. Obtuve un diálogo que decía que moc_FindAndReplaceBar había sido eliminado y me gustaría guardarlo con un nombre diferente. Pensé que cambiarle el nombre podría crear problemas más grandes, así que simplemente hice clic en 'Guardar' –

+0

Parece que su sistema de compilación está confundido. Elimine los archivos moc para que se regeneren. – Mat

Respuesta

11

A juzgar por sus llamadas de conexión (señal de señal), supongo que si nos fijamos en el archivo de cabecera, se le han declarado findNext(), findPrevious(), replace(), replaceAll() como señales, pero no hay que aplicar señales - que sólo tiene que ser declarado en el encabezado

De la documentación de Qt en 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

Eso es precisamente lo que hice. Gracias, puedo tomarlo desde aquí :) –

+0

Me encontré con esto también. Un error fácil cuando declaras las señales primero, luego copias y pegas a otra clase y te olvidas de cambiar las señales a las ranuras :) – anr78

Cuestiones relacionadas