Передача аргумента в слот - PullRequest
70 голосов
/ 01 марта 2011

Я хочу переопределить mouseReleaseEvent с помощью набора QActions и 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()));

Итак, я хочу передать аргумент в слот onStepIncreased (как вы можете себе представить, это 1,5,10,25,50). Ты знаешь, как я могу это сделать?

Ответы [ 5 ]

111 голосов
/ 01 марта 2011

Использовать QSignalMapper .Как это:

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))) ;
106 голосов
/ 14 марта 2014

С Qt 5 и компилятором C ++ 11, идиоматический способ сделать такие вещи - дать функтор для 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); });

Третий аргумент connect является номинально необязательным. Он используется для настройки контекста потока, в котором будет выполняться функтор. Это всегда необходимо, когда функтор использует экземпляр QObject. Если функтор использует несколько экземпляров QObject, у них должен быть какой-то общий родительский элемент, который управляет их временем жизни, а функтор должен ссылаться на этого родительского элемента, или необходимо обеспечить, чтобы объекты пережили функтор.

В Windows это работает в MSVC2012 и новее.

12 голосов
/ 01 марта 2011

Функция QObject::sender() возвращает указатель на объект, который подал сигнал в слот.Вы можете использовать это, чтобы узнать, какое действие было вызвано

1 голос
/ 01 марта 2011

Возможно, вы можете создать подкласс QAction с помощью переменной-члена m_increase.
Подключите сигнал triggered () к слоту вашего нового подкласса QAction и подайте новый сигнал (например, сработал (int number)) с правильным параметром.
например

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;  
};
0 голосов
/ 23 февраля 2018
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)));
} 
...