gpt4 book ai didi

c++ - 在 Qt 信号和槽中使用 lambda 语法并访问传递的参数

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:33:30 26 4
gpt4 key购买 nike

我有一个具有此签名的信号的类:

// 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还活着......理想情况下你会指定pClassXpClassC作为接收者,但这是不可能的。您可以利用 QPointer 的保护功能为此。

关于c++ - 在 Qt 信号和槽中使用 lambda 语法并访问传递的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55723875/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com