2012-08-29 7 views
2

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... 
} 

Répondre

2

Bien que l'utilisation QObject::sender() est parfaitement bien, l'approche idéaliste serait QSignalMapper

+0

Vous avez raison. Il évite de faire le foreach et la comparaison moi-même. Merci. – Yosko

2

Utilisez QObject::sender() dans votre emplacement pour obtenir l'expéditeur. Il renverra l'objet qui émet le signal. J'espère que cela t'aides.

+0

parfait, tout ce que je avais besoin. Merci. – Yosko