槽函数获取sender_Qt 使用 lambda 表达式做为槽函数时为什么使用 QObject::sender() 获取到的发送信号对象指针为空?...
时间: 2024-02-05 09:12:39 浏览: 120
使用 lambda 表达式作为槽函数时,无法直接通过 `QObject::sender()` 获取发送信号的对象指针,因为 lambda 表达式并没有继承 QObject 类,无法调用 QObject 的成员函数。
解决方法是将发送信号的对象指针作为参数传递给 lambda 表达式。可以使用 `std::bind` 或者 Qt 提供的 `QSignalMapper` 类来实现这个功能。
例如,使用 `std::bind` 可以这样写:
```cpp
connect(sender, &Sender::someSignal, this, std::bind(&MyClass::someSlot, this, sender));
```
其中,`sender` 是发送信号的对象指针,`MyClass::someSlot` 是槽函数,在调用时需要传递 `sender` 参数。
而使用 `QSignalMapper` 则可以这样写:
```cpp
QSignalMapper *mapper = new QSignalMapper(this);
connect(sender, &Sender::someSignal, mapper, SLOT(map()));
mapper->setMapping(sender, sender);
connect(mapper, SIGNAL(mapped(QObject*)), this, SLOT(someSlot(QObject*)));
```
其中,`mapper` 是一个 `QSignalMapper` 对象,用来映射发送信号的对象指针。在连接信号和槽函数时,将 `mapper` 的 `map()` 函数与信号连接起来,然后将 `sender` 对象指针作为参数传递给 `mapper` 的 `setMapping()` 函数。最后,将 `mapper` 的 `mapped()` 信号连接到槽函数 `someSlot()` 上,以便接收 `sender` 对象指针作为参数。
这样,无论是使用 `std::bind` 还是 `QSignalMapper`,都可以在 lambda 表达式中获取到发送信号的对象指针。
阅读全文