Qt 将静态参数添加到连接指令
Qt add statically parameters to connect directive
我的代码如下所示:
connect(c_name, SIGNAL(stateChanged(int) ), employeesList, SLOT(changeVisibility(int)));
其中 c_name
是 QCheckBox
,我想将其 stateChange
连接到 employeesList
中属性的可见性,该方法如下所示:
void changeVisibility(int prop, int visibility){
if(prop & EmployeeListElement::Name)
updateVisibility(&EmployeeListElement::name, visibility);
if(prop & EmployeeListElement::Surname)
updateVisibility(&EmployeeListElement::surname, visibility);
if(prop & EmployeeListElement::DateOfBirth)
updateVisibility(&EmployeeListElement::date_of_birth, visibility);
if(prop & EmployeeListElement::DateOfEmployment)
updateVisibility(&EmployeeListElement::date_of_empl, visibility);
}
private:
void updateVisibility(QLabel* EmployeeListElement::* elem, int visibility){
visibility ? (this->*elem)->show() : (this->*elem)->hide();
}
...
如您所见,我需要传递第二个参数,即我所指的 属性,所以我想做这样的事情:
connect(c_name, SIGNAL(stateChanged(int) ), employeesList, SLOT(changeVisibility(int, Class::first_enum_property)));
那行不通,我的问题是,有什么办法可以做到吗?也许不使用 SIGNAL
和 SLOT
指令并使用一些(可能)lambda?
使用 lambda 确实可以解决您的问题:
connect(c_name, &QCheckBox::stateChanged, employeesList, [employeesList](int visibility){employeesList->changeVisibility(Class::first_enum_property, visibility);});
请注意,第三个参数(即 context object)是可选的,但在 employeesList
被销毁时用于自动销毁连接。
参考资料
我的代码如下所示:
connect(c_name, SIGNAL(stateChanged(int) ), employeesList, SLOT(changeVisibility(int)));
其中 c_name
是 QCheckBox
,我想将其 stateChange
连接到 employeesList
中属性的可见性,该方法如下所示:
void changeVisibility(int prop, int visibility){
if(prop & EmployeeListElement::Name)
updateVisibility(&EmployeeListElement::name, visibility);
if(prop & EmployeeListElement::Surname)
updateVisibility(&EmployeeListElement::surname, visibility);
if(prop & EmployeeListElement::DateOfBirth)
updateVisibility(&EmployeeListElement::date_of_birth, visibility);
if(prop & EmployeeListElement::DateOfEmployment)
updateVisibility(&EmployeeListElement::date_of_empl, visibility);
}
private:
void updateVisibility(QLabel* EmployeeListElement::* elem, int visibility){
visibility ? (this->*elem)->show() : (this->*elem)->hide();
}
...
如您所见,我需要传递第二个参数,即我所指的 属性,所以我想做这样的事情:
connect(c_name, SIGNAL(stateChanged(int) ), employeesList, SLOT(changeVisibility(int, Class::first_enum_property)));
那行不通,我的问题是,有什么办法可以做到吗?也许不使用 SIGNAL
和 SLOT
指令并使用一些(可能)lambda?
使用 lambda 确实可以解决您的问题:
connect(c_name, &QCheckBox::stateChanged, employeesList, [employeesList](int visibility){employeesList->changeVisibility(Class::first_enum_property, visibility);});
请注意,第三个参数(即 context object)是可选的,但在 employeesList
被销毁时用于自动销毁连接。
参考资料