Передача аргумента в слот
Я хочу переопределить 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 ответов
использовать 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))) ;
С 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 и новее.
на QObject::sender()
функция возвращает указатель на объект, который сигнализировал в слот. Вы можете использовать это, чтобы узнать, какое действие было вызвано
возможно, вы можете подкласс QAction с переменной-членом m_increase.
Подключите сигнал triggered () к слоту в новом подклассе QAction и выдайте новый сигнал (например, triggered(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;
};
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)));
}