Qt - 使用lambda函数修改上一个连接信号的插槽参数
我试图将信号重新连接到同一个插槽,但使用不同的参数。如果我只是想在不使用参数或lambda函数的情况下将相同的信号重新连接到不同的插槽,但我需要这样做,这将工作。Qt - 使用lambda函数修改上一个连接信号的插槽参数
起初,我想是这样的:
connect(remove_btn,&QPushButton::clicked,[this, id] {function1(varA);});
connect(remove_btn,&QPushButton::clicked,[this, id] {function1(varB);});
function1
接收varA
永不varB
。
我找到了一种方法来做到这一点,保持一个连接列表,当我想修改参数时,我会断开旧连接并建立新连接。
我想知道的是,如果有一种方法可以在不需要跟踪所有连接并进行discconnect/connect过程的情况下进行修改。
两种解决方案来我的脑海:
-
通过引用捕获
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); } };
我想出了一个基于你的想法的解决方案。我的类有一个变量,其中包含id号(让它命名为'var_id') 现在我只是使用'connect(remove_btn,&QPushButton :: clicked,[this] {function1(myClass-> var_id);});' 并且改变'function1()'里面的'var_id'值,这样就改变了connect价值 这个想法以前有点过头,但不知何故,我忽略了它,谢谢你的帮助。 – RubenC
您可能能够使用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);
bind()不起作用,它给了我错误“没有重载的bind()...的实例),但是我用相应的正确参数来使用它,我甚至检查了其他例子,也许这是我的项目但无论如何,我发现我的问题的解决方案,谢谢@xander – RubenC
@AlexanderVX忘记 “ID” 变种。我忘了从我的例子中删除它,这是无关紧要的。关于你的例子我不确定你试图给我看,但两个连接都有相同的参数,这不是我的问题。不过谢谢。 – RubenC