Passer un SLOT en paramètre d'une fonction¶
Imaginez que vous voulez passer un slot dans un appel de fonction, pour avoir par exemple:
createBouton(dessin,"calapa", 70, 20,220,140,SLOT(btnExerciceClicked()));
createBouton(dessin,"queVoir", 200, 0,210,120,SLOT(btnExerciceClicked()));
createBouton(dessin,"constellation",315, 15,230,170,SLOT(btnExerciceClicked()));
createBouton(dessin,"barques", 15,105,250,150,SLOT(btnExerciceClicked()));
createBouton(dessin,"nombres", 355,105,250,140,SLOT(btnExerciceClicked()));
createBouton(dessin,"train", 60,190,220,150,SLOT(btnExerciceClicked()));
createBouton(dessin,"calapaTri", 200,200,220,145,SLOT(btnExerciceClicked()));
createBouton(dessin,"ordinal", 340,190,250,150,SLOT(btnExerciceClicked()));
Il suffit que votre fonction createBouton puisse prendre un SLOT comme paramètre et l'affaire est jouée:
void createBouton(QGraphicsScene * dessin, QString nom,int x,int y,int w, int h, const char * myslot)
{
connect(bouton,SIGNAL(clicked()),this,myslot);
}
Ce qui est important c'est le const char * myslot ... en effet un SLOT n'est ni plus ni moins qu'un "const char *" tout simplement.
On peut également passer ce paramètre à un objet d'une autre classe, à condition de l'accompagner de l'objet d'où il vient.
Exemple :
AbulEduUnitPrinterV1 up = new AbulEduUnitPrinterV1(this); up->abeUnitPrintSetRenderSlot(this,SLOT(slotBuildRenderPage()));
avec dans le fichier entête de ma classe AbulEduUnitPrinterV1
/// /// \brief Passe depuis un objet extérieur un slot à connecter au bouton OK. /// \note Seule l'application sait ce qu'il faut faire pour construire le rendu /// \param obj l'objet auquel appartient le slot /// \param slot le slot qui construit le rendu /// void abeUnitPrintSetRenderSlot(QObject *obj, const char * slot);
et dans le fichier source
void AbulEduUnitPrinterV1::abeUnitPrintSetRenderSlot(QObject* obj,const char *slot){ connect(ui->unitPrinterBtnOK, SIGNAL(clicked()),obj, slot, Qt::UniqueConnection); }