90 votes

Passer un argument à un slot

Je souhaite remplacer mouseReleaseEvent par un ensemble de QActions et QMenus ...

 connect(action1, SIGNAL(triggered()), this, SLOT(onStepIncreased()));

connect(action5, SIGNAL(triggered()), this, SLOT(onStepIncreased()));

connect(action10, SIGNAL(triggered()), this, SLOT(onStepIncreased()));

connect(action25, SIGNAL(triggered()), this, SLOT(onStepIncreased()));

connect(action50, SIGNAL(triggered()), this, SLOT(onStepIncreased()));
 

Je souhaite donc passer un argument à la fente onStepIncreased (comme vous pouvez l’imaginer, il s’agit de 1,5,10,25,50). Savez-vous comment je peux le faire?

140voto

Kuba Ober Points 18926

Avec Qt 5 et un compilateur C ++ 11, la façon idiomatique de faire de telles choses est de donner un foncteur à connect :

 connect(action1,  &QAction::triggered, this, [this]{ onStepIncreased(1); });
connect(action5,  &QAction::triggered, this, [this]{ onStepIncreased(5); });
connect(action10, &QAction::triggered, this, [this]{ onStepIncreased(10); });
connect(action25, &QAction::triggered, this, [this]{ onStepIncreased(25); });
connect(action50, &QAction::triggered, this, [this]{ onStepIncreased(50); });
 

Le troisième argument de connect est nominalement optionnel. Il est utilisé pour configurer le contexte du thread dans lequel le foncteur s'exécutera. Cela est nécessaire lorsque le foncteur utilise une instance QObject et que l'expéditeur peut se trouver dans un autre thread.

Sous Windows, cela fonctionne dans MSVC2012 et plus récent.

126voto

TonyK Points 8604

Utilisez QSignalMapper . Comme ça:

 QSignalMapper* signalMapper = new QSignalMapper (this) ;
connect (action1, SIGNAL(triggered()), signalMapper, SLOT(map())) ;
connect (action5, SIGNAL(triggered()), signalMapper, SLOT(map())) ;
connect (action10, SIGNAL(triggered()), signalMapper, SLOT(map())) ;
connect (action25, SIGNAL(triggered()), signalMapper, SLOT(map())) ;
connect (action50, SIGNAL(triggered()), signalMapper, SLOT(map())) ;

signalMapper -> setMapping (action1, 1) ;
signalMapper -> setMapping (action5, 5) ;
signalMapper -> setMapping (action10, 10) ;
signalMapper -> setMapping (action25, 25) ;
signalMapper -> setMapping (action50, 50) ;

connect (signalMapper, SIGNAL(mapped(int)), this, SLOT(onStepIncreased(int))) ;
 

14voto

king_nak Points 4093

La fonction QObject::sender() renvoie un pointeur sur l'objet qui a été signalé à l'emplacement. Vous pouvez utiliser ceci pour savoir quelle action a été déclenchée

1voto

Kurt Pattyn Points 1650

Peut-être que vous pouvez sous-classer QAction avec une variable membre m_increase.
Connectez le signal triggered () à un emplacement de votre nouvelle sous-classe QAction et émettez un nouveau signal (par exemple, triggered (int number)) avec le paramètre correct.
par exemple

 class MyAction:public QAction  
{  
public:  
    MyAction(int increase, ...)  
        :QAction(...), m_increase(increase)
    {  
        connect(this, SIGNAL(triggered()), this, SLOT(onTriggered()));  
    }  
protected Q_SLOTS:  
    void onTriggered()  
    {  
        emit triggered(m_increase);  
    }  

Q_SIGNALS:
    void triggered(int increase);   

private:  
    int m_increase;  
};
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X