Qt - 使用lambda函数修改先前连接信号的槽参数
Qt - modify slot's parameter of previous connected signal using lambda function
我正在尝试将信号重新连接到同一个插槽,但参数不同。如果我只是想在不使用参数或 lambda 函数的情况下将相同的信号重新连接到不同的插槽,这将起作用,但我需要这样做。
起初我尝试过这样的事情:
connect(remove_btn,&QPushButton::clicked,[this, id] {function1(varA);});
connect(remove_btn,&QPushButton::clicked,[this, id] {function1(varB);});
function1
接收 varA
而从不接收 varB
.
我找到了一种通过保留连接列表来实现此目的的方法,当我想修改参数时,我只需断开旧连接并建立新连接。
我想知道的是,是否有一种方法可以进行此修改,而无需跟踪所有连接并完成 discconnect/connect 过程。
您也许可以使用 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);
我想到了两个解决方案:
通过引用捕获 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);
}
};
我正在尝试将信号重新连接到同一个插槽,但参数不同。如果我只是想在不使用参数或 lambda 函数的情况下将相同的信号重新连接到不同的插槽,这将起作用,但我需要这样做。
起初我尝试过这样的事情:
connect(remove_btn,&QPushButton::clicked,[this, id] {function1(varA);});
connect(remove_btn,&QPushButton::clicked,[this, id] {function1(varB);});
function1
接收 varA
而从不接收 varB
.
我找到了一种通过保留连接列表来实现此目的的方法,当我想修改参数时,我只需断开旧连接并建立新连接。
我想知道的是,是否有一种方法可以进行此修改,而无需跟踪所有连接并完成 discconnect/connect 过程。
您也许可以使用 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);
我想到了两个解决方案:
通过引用捕获
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); } };