una trabajo tecnicas tanto significa que porque peleo pelear pelea pareja para mucho ganar frases discutir discusiones cuando con como aprender qt qsignalmapper qt-slot

qt - trabajo - Pasar una discusión a una ranura



porque peleo tanto con mi pareja (5)

Quiero anular mouseReleaseEvent con un montón de QActions y 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()));

Así que quiero pasar una discusión a la ranura en onStepIncreased (como se puede imaginar son 1,5,10,25,50). ¿Sabes cómo puedo hacerlo?


Con Qt 5 y un compilador C ++ 11, la manera idiomática de hacer tales cosas es dar un functor para 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); });

El tercer argumento para connect es nominalmente opcional. Se usa para configurar el contexto del hilo en el que se ejecutará el funtor. Siempre es necesario cuando el funtor utiliza una instancia de QObject . Si el funtor usa múltiples instancias de QObject , deben tener un elemento primario común que administre su tiempo de vida y el programa de ejecución debe referirse a ese elemento primario, o se debe garantizar que los objetos sobrevivan al elemento de ejecución.

En Windows, esto funciona en MSVC2012 y más reciente.


La función QObject::sender() devuelve un puntero al objeto que se ha señalizado en la ranura. Puede usar esto para descubrir qué acción se activó


Tal vez pueda subclasificar QAction con una variable de miembro m_increase.
Conecte la señal disparada () a una ranura en su nueva subclase QAction y emita una nueva señal (por ejemplo, desencadenado (número int)) con el parámetro correcto.
p.ej

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


Use QSignalMapper . Me gusta esto:

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


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