Dans mon application Qt, je crée dynamiquement certains de mes widgets. Parmi eux, QToolButtons doit avoir un comportement similaire.Qt: connexion de widgets et de connecteurs dynamiques
Voici comment les widgets sont créés:
QMap<QString, QToolButton*> unselectButtonMap;
foreach(QString instance, ...) {
unselectButtonMap[instance] = new QToolButton;
myLayout->addWidget(unselectButtonMap[instance]);
QObject::connect(unselectButtonMap[instance],SIGNAL(clicked()),this,SLOT(unselectInstance()));
}
Maintenant, je voudrais la fente unselectInstence
de savoir quelle instance est concerné. Je veux d'abord donner le nom de l'instance en tant que paramètre à la fente, mais les fentes prennent seulement des paramètres à partir des signaux. L'idée était quelque chose comme:
QObject::connect(unselectButtonMap[instance],SIGNAL(clicked()),this,SLOT(unselectInstance(instance)));
Une autre idée sur la façon de faire cela?
Remarques: J'utilise Qt4.8
EDIT: basé sur réponse de shan, et parce que je devais le nom d'instance au lieu de l'QToolButton lui-même, voici ce que je suis venu à
void MyWindow::unselectInstance() {
foreach(QString instance, unselectButtonMap.keys()) {
if(unselectButtonMap[instance] == QObject::sender()) {
//do stuff here...
}
}
}
La comparaison de pointeurs semble plutôt bien fonctionner.
RE-EDIT: et fonction de la réponse de user1313312, nous déclarer QSignalMapper:
QSignalMapper *signalMapper = new QSignalMapper(this);
QObject::connect(signalMapper, SIGNAL(mapped(QString)), this, SLOT(unselectInstance(QString)));
puis connectez le QToolButton au mappeur
signalMapper->setMapping(unselectButtonMap[instance], instance);
QObject::connect(unselectButtonMap[instance],SIGNAL(clicked()),signalMapper,SLOT(map()));
et la fente serait beaucoup plus simple:
void MyWindow::unselectinstance(QString instance) {
//do stuff here...
}
Vous avez raison. Il évite de faire le foreach et la comparaison moi-même. Merci. – Yosko