web-dev-qa-db-fra.com

Passer un argument à un slot

Je souhaite remplacer mouseReleaseEvent par un groupe de QActions et de 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 variable onStepIncreased (comme vous pouvez l’imaginer, il s’agit de 1,5,10,25,50). Savez-vous comment je peux le faire?

65
Fatih Arslan

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))) ;
109
TonyK

Avec Qt 5 et un compilateur C++ 11, la manière 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. Il est toujours nécessaire lorsque le foncteur utilise une instance QObject. Si le foncteur utilise plusieurs instances QObject, il doit avoir un parent commun qui gère sa durée de vie et le foncteur doit faire référence à ce parent, ou il faut s’assurer que les objets survivront à ce dernier.

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

96
Kuba Ober

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

10
king_nak

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;  
};
1
Kurt Pattyn
QVector<QAction*> W(100);
 W[1]= action1;
 W[5]= action5;
 W[10]= action10;
 W[25]= action25;
 W[50]= action50;

for (int i=0; i<100; ++i)
{
  QSignalMapper* signalmapper = new QSignalMapper();
  connect (W[i], SIGNAL(triggered()), signalmapper, SLOT(map())) ;
  signalmapper ->setMapping (W[i], i);
  connect (signalmapper , SIGNAL(mapped(int)), this, SLOT(onStepIncreased(int)));
} 
0
Jaziri Rami