2015-09-22 2 views
3

J'ai n boutons initialement tous étiquetés «0». Ces étiquettes, ou valeurs, changeront en différents entiers lorsque le programme s'exécutera, par exemple à un moment donné: '7', '0', '2', ...Comment passer une valeur avec un signal cliqué à partir d'un Qt PushButton?

J'ai une fonction (ou fente) qui prend un int comme argument:

void do_stuff(int i); 

je veux appeler do_stuff (x) lorsque x '' est pressée. C'est-à-dire: quand vous appuyez sur n'importe quel bouton, appelez do_stuff avec la valeur de ce bouton. Comment puis-je faire cela? Jusqu'à présent, j'ai quelque chose comme:

std::vector values; // keeps track of the button values 
for (int i = 0; i < n; i++){ 
    values.push_back(0); 
    QPushButton* button = new QPushButton("0"); 
    layout->addWidget(button); 
    // next line is nonsense but gives an idea of what I want to do: 
    connect(button, SIGNAL(clicked()), SLOT(do_stuff(values[i]))); 
} 
+3

Voir dans à [QSignalMapper] (http://doc.qt.io/qt-5/qsignalmapper.html) classe. – crayzeewulf

+0

C'est exactement ce que je voulais, merci! – Julien

Répondre

3

Je simplifieraient que ce habituellement utilisé pour résoudre cette tâche:

public slots: 
    void do_stuff(); // must be slot 

et la connexion devrait être comme

connect(button, SIGNAL(clicked()), SLOT(do_stuff())); 

puis MyClass: : do_stuff fait des choses:

void MyClass::do_stuff() 
{ 
    QPushButton* pButton = qobject_cast<QPushButton*>(sender()); 
    if (pButton) // this is the type we expect 
    { 
     QString buttonText = pButton->text(); 
     // recognize buttonText here 
    } 
} 
+0

Cela ressemble à un autre bon moyen, bien que dans mon cas, la suggestion de cartographie de crayzeewulf semble un meilleur ajustement (ce que je fais en réalité est plus complexe que l'exemple de jouet dans mon post). Mais puisque cela répond à la question affichée, je l'accepterai! – Julien

+0

@JulienBernu, vous pouvez hériter de QPushButton, puis lancer sender() vers ce nouveau type et lire tout ce dont vous avez besoin. Assurez-vous de définir toutes les données avec QPushButton hérité. – AlexanderVX