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?
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))) ;
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.
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
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;
};
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)));
}