我有一个具有此签名的信号的类:
// CLASS A
signals:
void requestToChangeRange(voltage_range_e vr, current_range_e cr, uint16_t bits);
还有另一个类有这样一个插槽(注意额外的参数)
// CLASS C
public slots:
void handleRequestRangeChange(voltage_range_e vr, current_range_e cr, uint16_t bits, uint16_t limiter);
然后我有一个类“B”,它充当所有其他类的交汇点。当“A”类发出信号时,“C”类应将其重定向到“B”类。但是在类“B”的插槽上的额外参数是问题所在,因为该额外参数来自另一个类“X”。
因此,如果“A”类和“C”类的信号和槽匹配,我将在“B”类中执行以下操作:
// somewhere in CLASS B (the manager of all other classes)
connect(pClassA, &ClassA::requestToChangeRange,
pClassC, &ClassC::handleRequestRangeChange);
但很明显,由于函数签名,这是行不通的。我想做的是这样的:
// somewhere in CLASS B (the manager of all other classes)
connect(pClassA, &ClassA::requestToChangeRange,
this /* class B */, []() {
// Get that last required parameter from class X
uint16_t limiter = pClassX->getValue();
// Call slot of class C
pClassC->handleRequestRangeChange(vr, cr, bits, limiter);
});
那么我如何访问 lambda 中传递的参数呢?这可能吗?
最佳答案
你的 lambda 应该知道这两个对象:[pClassX, pClassC]
并接受信号的原始参数:(voltage_range_e vr, current_range_e cr, uint16_t bits)
.
所以你的连接应该像这样开始:
connect(pClassA, &ClassA::requestToChangeRange, this,
[pClassX, pClassC](voltage_range_e vr, current_range_e cr, uint16_t bits) {
//...
});
关于 connect() 语句中的“receiver”:
当连接到 lambda 时实际上不需要这个指向 QObject 的指针,但它的目的是在发送方或接收方被破坏时删除信号槽连接。
使用 this
意味着您必须确保在删除 pClassX
中的任何一个之后, pClassC
你不再发出信号了。或者你可以使用 pClassC
作为接收者,那么你必须确定 pClassX
只要 pClassC
就保持有效和 pClassA
还活着......理想情况下你会指定pClassX
和 pClassC
作为接收者,但这是不可能的。您可以利用 QPointer
的保护功能为此。
关于c++ - 在 Qt 信号和槽中使用 lambda 语法并访问传递的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55723875/