Qt - изменить параметр слота предыдущего подключенного сигнала с помощью лямбда-функции
Я пытаюсь подключить сигнал к тому же слоту, но с другим параметром. Это сработало бы, если бы я просто хотел повторно подключить один и тот же сигнал к другому слоту без использования параметров или лямбда-функций, но мне нужно сделать это таким образом.
Сначала я попробовал что-то вроде этого:
connect(remove_btn,&QPushButton::clicked,[this, id] {function1(varA);});
connect(remove_btn,&QPushButton::clicked,[this, id] {function1(varB);});
function1
получает varA
и никогда varB
,
Я нашел способ сделать это, сохранив список соединений, и когда я хотел изменить параметр, я просто отключил старое и установил новое соединение.
То, что я хотел бы знать, есть ли способ сделать это изменение без необходимости отслеживать все соединения и проходить процесс discconnect/connect.
2 ответа
Мне приходят на ум два решения:
Захватить
var
по ссылке и измените его вместо повторного подключения:class Foo : public QWidget { Q_OBJECT int remove_btn_var; int varA = 10, varB = 20; QPushButton remove_btn; void function1(int); public: Foo() { remove_btn_var = varA; connect(&remove_btn, &QPushButton::clicked, [&] { function1(remove_btn_var); }); } void switch() { remove_btn_var = varB; } };
Добавьте к кнопке свойство, которое вы можете изменить:
static const char k_function1_var[] = "function1_var"; class Foo : public QWidget { Q_OBJECT int varA, varB; QPushButton remove_btn; void function1(int); public: Foo() { remove_btn.setProperty(k_function1_var, varA); connect(&remove_btn, &QPushButton::clicked, [this] { function1(remove_btn.property(k_function1_var).toInt()) }); } void switch() { remove_btn.setProperty(k_function1_var, varB); } };
Вы могли бы использовать std::bind
, так как QPushButton::clicked
сигнал имеет 1 параметр (bool checked
) должно быть достаточно для использования:
auto f = std::bind(function1, varA); // checked argument ignored (std::placeholders::_1)
connect(remove_btn,&QPushButton::clicked,f);