Ich möchte mouseReleaseEvent mit einer Reihe von QActions und QMenus überschreiben ...
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()));
Ich möchte also ein Argument an den Slot onStepIncreased
übergeben (wie Sie sich vorstellen können, sind sie 1,5,10,25,50). Weißt du, wie ich es schaffen kann?
Verwenden Sie QSignalMapper . So was:
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))) ;
Mit Qt 5 und einem C++ 11-Compiler besteht der idiomatische Weg, solche Dinge zu tun, darin, connect
einen Funktor zu geben:
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); });
Das dritte Argument für connect
ist nominal optional. Es wird verwendet, um den Thread-Kontext festzulegen, in dem der Functor ausgeführt wird. Dies ist immer dann erforderlich, wenn der Functor eine QObject
-Instanz verwendet. Wenn der Functor mehrere QObject
-Instanzen verwendet, sollten sie über gemeinsame Parent-Elemente verfügen, die ihre Lebensdauer verwalten, und der Functor sollte sich auf diesen Parent beziehen, oder es sollte sichergestellt werden, dass die Objekte den Functor überleben.
Unter Windows funktioniert dies in MSVC2012 und neuer.
Die Funktion QObject::sender()
gibt einen Zeiger auf das Objekt zurück, das dem Slot signalisiert wurde. Damit können Sie herausfinden, welche Aktion ausgelöst wurde
Vielleicht können Sie QAction mit einer M_increase-Membervariablen unterteilen.
Verbinden Sie das getriggerte () - Signal mit einem Steckplatz in Ihrer neuen QAction-Unterklasse und geben Sie ein neues Signal (z. B. getriggert (int number)) mit dem richtigen Parameter aus.
z.B.
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)));
}