11

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!

W.K.S
  • 9,787
  • 15
  • 75
  • 122
  • Try to do a full, clean build. Sometimes things get out of sync. – Mat Jan 04 '12 at 17:20
  • I did. I got a dialog that the moc_FindAndReplaceBar had been removed and would I like to save it with a different name. I thought renaming it might create bigger problems so I just clicked on 'Save' – W.K.S Jan 04 '12 at 17:22
  • Looks like your build system is confused. Remove the moc files so that they get regenerated. – Mat Jan 04 '12 at 17:23

1 Answers1

20

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).

Vuks
  • 801
  • 1
  • 7
  • 24
Roger Attrill
  • 386
  • 3
  • 11
  • 1
    That's precisely what I did. Thanks, I can take it from here :) – W.K.S Jan 04 '12 at 18:38
  • 1
    I just ran into this as well. An easy mistake when you declare the signals first, then copy & paste to another class and forget to change signals to slots :) – anr78 Apr 24 '15 at 08:26