Projet

Général

Profil

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);
}

Redmine Appliance - Powered by TurnKey Linux