J'ai rajouté 'i' dans la liste des élément capturé par la fonction lambda, car je recevais une erreur m'indiquant qu'il ne le connaissait pas. J'ai maintenant une erreur qui me retourne
Puisque i est une valeur externe a ton connect, oui. (Je suppose que tu as une boucle qui crée plusieurs connexions, une pour chaque combobox ?)
J'ai testé avec this et avec le QLineEdit
Il faut faire attention de ne pas confondre les 2 syntaxes (avec un slot et avec une lambda).
Avec un slot, la fonction connect prend en paramètre un objet (QObject) et un pointeur de fonction membre (syntaxe barbare, mais pas trop)
| connect(
sender, signal, // osef...
object, // QObject* qui reçoit le slot
&NomClasse::NomFunction // signature de la fonction membre (slot) qui sera appelée
);
|
Dans ce cas, l'objet doit obligatoirement être celui qui contient le slot (+ d'autres contraintes : ajouter la macro Q_OBJECT, déclarer la fonction comme slot).
Avec une lambda, tu peux avoir 2 signatures pour connect :
1
2
3
4
5
6
7
8
9
10
11
12 | connect(
sender, signal, // osef...
function // n'importe quoi d'appelable ("callable") : function
// libre, lambda, std::bind, etc.
);
connect(
sender, signal, // osef...
object, // QObject*
function // n'importe quoi d'appelable ("callable") : function
// libre, lambda, std::bind, etc.
);
|
Une fonction membre s’exécute dans le contexte particulier de l'objet sur lequel elle est appelée (le this), il faut donc fournir cet objet. Une lambda s’exécute dans son propre contexte, elle n'a pas besoin d’être appelée via un objet.
Dans le cas d'une lambda, l'objet est utilise uniquement pour détruire la connexion si l'objet est détruit. Il ne sert pas a exécuter la lambda.
Par contre, DANS la lambda, tu peux appeler des fonctions membres. Et ces fonctions membres doivent donc être appelée via un objet (le contexte d'appel de la fonction membre). Les objets sont passés dans le contexte de la lambdas via la capture (les []).
Donc pour résumer, tu as 3 contextes :
- le contexte de la fonction membre dans lequel tu appelles le connect
- le contexte de la lambda
- le contexte de la fonction membre DANS la lambda
Au final, dans le connect :
- le premier this permet de détruire la connexion, mais n'est pas utilise par la lambda
- le second this (dans la capture []) permet d'envoyer this a la lambda pour appeler la fonction membre DANS la lambda.
Tu peux donc utiliser this ou at(i), c'est pareil, mais c'est different : dans le premier cas, tu detruit la connexion quand this est detruit, dans le second cas lorsque l'une des combobox est detruite (si une combobox peut etre detruite individuellement, c'est mieux la seconde syntaxe).
Par contre, il est preferable de rester coherent :
1
2
3
4
5
6
7
8
9
10
11
12
13 | auto macombobox = malistedeQlineEdit.at(i);
connect(
...
macombobox,
[this, macombobox,i](){ mon_slot(macombobox->currentIndex()); } // il faut les 3 dans []
);
// ou
connect(
...
this
[this,i](){ mon_slot(malistedeComboxBox.at(i)->currentIndex()); }
|
Le but de passer un objet dans le connect pour detruire la connexion est d'eviter d'appeler la lambda avec des donnees invalides. Donc on passe les memes donnees dans la lambda et le connect.
EDIT je viens aussi de penser au fait que j'ai lu qu'il fallait préciser quelle version de current.index() j'utilisais en précisant le type de retour de la fonction, je n'ai pas réussi à appliquer ça à mon code.
Oui (probleme restant de Qt4…)
| connect(
comboBox,
static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
|