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

标签 c++ qt c++11 lambda signals-slots

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

// 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/

相关文章:

c++ - Win32/Qt - 可以枚举属于调用进程的所有顶层窗口吗?

c++ - 由于 QCoreApplication 事件循环,QThread 永远不会退出

c++11 - boost asio post 不起作用,io_service::run 在 post 后立即退出

c++ - 使用 clang 优化进行编译时出现意外结果

c++ - 使用 SqlConnection 在托管 C++ 中连接和查询数据库

c++ - 如何通过交叉编译构建调试 Qt dll 问题?

c++ - Qt 向 QMainWindow 添加非菜单栏键盘快捷方式

c++ - C++ 编译器如何区分二元运算符和模板的标记 >>

c++ - 使用 _set_purecall_handler 时如何在已发布的应用程序中获取调用堆栈

c++ - 使用没有模板参数的模板类