Question

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!

Was it helpful?

Solution

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

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top