Передача аргумента в слот
Я хочу переопределить 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))); }
Comments