Questions about slots
-
Hi ! I'm sorry, in advance, for my bad english.
I'm trying to run a program which use slots. Compilation works but when I run the program, he wait and don't do anything.
Here we have the function :
void Fenetre::Commencer() { main_display->setText("Bienvenue dans jhqqjhfqjf, le nouveau jeu video de la mort qui tue !\n"); boutons[0]->setText("Commencer"); boutons[1]->setText("Quitter ? Deja ?"); boutons[2]->setText("Bouton vers la victoire"); boutons[2]->setEnabled(false); //Parce que c'est marrant connect(boutons[0], SIGNAL(pressed()), this, SLOT(Etape(0,0))); connect(boutons[1], SIGNAL(pressed()), this, SLOT(reject())); }
And his declaration on my class :
public slots: void Etape(int from, int to);
Can I put arguments in a slot ?
Thank's !
Alexandre. -
Hi ! I'm sorry, in advance, for my bad english.
I'm trying to run a program which use slots. Compilation works but when I run the program, he wait and don't do anything.
Here we have the function :
void Fenetre::Commencer() { main_display->setText("Bienvenue dans jhqqjhfqjf, le nouveau jeu video de la mort qui tue !\n"); boutons[0]->setText("Commencer"); boutons[1]->setText("Quitter ? Deja ?"); boutons[2]->setText("Bouton vers la victoire"); boutons[2]->setEnabled(false); //Parce que c'est marrant connect(boutons[0], SIGNAL(pressed()), this, SLOT(Etape(0,0))); connect(boutons[1], SIGNAL(pressed()), this, SLOT(reject())); }
And his declaration on my class :
public slots: void Etape(int from, int to);
Can I put arguments in a slot ?
Thank's !
Alexandre.Hi @saxoalex, and welcome!
@saxoalex said in Questions about slots:
Can I put arguments in a slot ?
No. A slot can only get arguments from the signal.
connect(boutons[0], SIGNAL(pressed()), this, SLOT(Etape(0,0)));
This connection is wrong because:
- The
pressed()
signal has no arguments, so it can only be connected to slots that also have no arguments. - You cannot write values/numbers in the connection. You can only write data types (such as "bool", "int", or "QString"). Example:
connect(slider, SIGNAL(valueChanged(int)), spinbox, SLOT(setValue(int)));
// slider is a QSlider, spinbox is a QSpinBox
connect(boutons[1], SIGNAL(pressed()), this, SLOT(reject()));
This connection is OK.
Compilation works but when I run the program, he wait and don't do anything.
First, please read http://doc.qt.io/qt-5/signalsandslots-syntaxes.html
You are using String-based connections, so your compiler cannot check them. You can change to Functor-based signals and let your compiler do the checks.
// OK connect(boutons[1], &QPushButton::pressed, this, &Fenetre::reject); // Compiler error. The signal and slot are not compatible connect(boutons[0], &QPushButton::pressed, this, &Fenetre::Etape); // OK -- using a Lambda Expression connect(boutons[0], &QPushButton::pressed, [this] { this->Etape(0,0); });
- The