webentwicklung-frage-antwort-db.com.de

Argument an einen Slot übergeben

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?

65
Fatih Arslan

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

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.

96
Kuba Ober

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

10
king_nak

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;  
};
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