Search code examples
qtsignals-slots

Working of signals and slots


I have a basic doubt about how signals and slots actually work. Here's my code segment.

finddialog.cpp :

#include "finddialog.h"
#include <QtGui>
#include <QHBoxLayout>
#include <QVBoxLayout>


FindDialog::FindDialog(QWidget *parent) :   QDialog(parent) {

    //VAR INITIALIZATIONS
    label = new QLabel(tr("Find &what:"));
    lineEdit = new QLineEdit;
    label->setBuddy(lineEdit);

    caseCheckBox = new QCheckBox(tr("Match &case"));
    backwardCheckBox = new QCheckBox(tr("Search &backward"));

    findButton = new QPushButton("&Find");
    findButton->setDefault(true);
    findButton->setEnabled(false);

    closeButton = new QPushButton(tr("&Quit"));

    //SIGNALS & SLOTS
    connect (lineEdit, SIGNAL(textChanged(const QString&)),this, SLOT(enableFindButton(const QString&)));
    connect (findButton, SIGNAL(clicked()), this, SLOT(findClicked()));
    connect (closeButton,SIGNAL(clicked()), this, SLOT(close()));

   //Layout
    QHBoxLayout *topLeftLayout = new QHBoxLayout;
    topLeftLayout->addWidget(label);
    topLeftLayout->addWidget(lineEdit);

    QVBoxLayout *leftLayout = new QVBoxLayout;
    leftLayout->addLayout(topLeftLayout);
    leftLayout->addWidget(caseCheckBox);
    leftLayout->addWidget(backwardCheckBox);

    QVBoxLayout *rightLayout = new QVBoxLayout;
    rightLayout->addWidget(findButton);
    rightLayout->addWidget(closeButton);
    rightLayout->addStretch();

    QHBoxLayout *mainLayout = new QHBoxLayout;
    mainLayout->addLayout(leftLayout);
    mainLayout->addLayout(rightLayout);

    //Complete window settings

    setLayout(mainLayout);

    setWindowTitle(tr("Find"));
    setFixedHeight(sizeHint().height());

}

//Function Definition
void FindDialog::findClicked()  {

    QString text = lineEdit->text();
    Qt::CaseSensitivity cs = caseCheckBox->isChecked() ? Qt::CaseSensitive : Qt::CaseInsensitive;
    if(backwardCheckBox->isChecked())
        emit findPrevious(text, cs);
    else
        emit findNext(text,cs);
}

void FindDialog::enableFindButton(const QString &text1) {
    findButton->setEnabled(!text1.isEmpty());
}

With this code, how does the compiler know what is passed to enableFindButton(QString &) function. There are no function calls to enableFindButton(). In the connect statement there is a reference to enableFindButton() but isn't that more like a prototype because we are not providing the name of the variables to work with in its arguments?

connect (lineEdit, SIGNAL(textChanged(const QString&)),this, SLOT(enableFindButton(const QString&)));

Here only (const QString &) is the argument and a variable is not given. How does the application know what its argument is without passing it explicitly?

 void FindDialog::enableFindButton(const QString &text1) {
    findButton->setEnabled(!text1.isEmpty());
}

Here also &text1 is a reference argument. But to what ? I don't understand anything now after typing this all! :-|


Solution

  • Qt is generating the code that makes it work when you build the project.

    SIGNAL, SLOT, etc are preprocessor macros defined in qobjectdefs.h

    These are then picked up by moc in QT when you build your project, and all the code required is generated, then compiled.

    A decent page that explains this in more detail can be found here