Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiple definitions error: one in my file and one in the moc file.

I have a class called FindAndReplaceBar, whose implementation is this:

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

When I run the program I get problems of multiple definitions of the functions:

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

The other definition is made in the moc_FindAndReplaceBar.cpp file. I'm not sure what the problem so I don't know how to fix it! I would really appreciate any help, thanks!

like image 898
W.K.S Avatar asked Jan 04 '12 17:01

W.K.S


1 Answers

Judging by your connect calls (signal to signal), I assume if we look at your header file, you will have declared findNext(), findPrevious(), replace(), replaceAll() as signals, but you must not implement signals - they just need to be declared in the header.

From the Qt docs on 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).

like image 59
Roger Attrill Avatar answered Sep 19 '22 02:09

Roger Attrill