this 指针

如果 lambda 在一个对象内部并且捕获了 this ,connect 的第三个参数必须写上 this ,防止 lambda 访问 内存释放了的 this 指针。

1
2
connect(a, &A::signal, this, [this]{})
// 第三个参数非常重要

原始指针

原始指针必须以值捕获,并且确保指针的生命周期比 connect 的生命周期长

1
2
3
status int v;
autp p = & v;
connect(a, &A::signal, [p]{})

引用捕获

引用捕获和原始指针一样

没有继承自 QObject 并且不能拷贝的对象

必须以值捕获它们的 shared_ptr

1
2
3
std::shared_ptr<E> e { new E };
QSharedPointer<F> f { new F; }
connect(..., [e,f]{});

同一个线程的 QObject

以 QPointer 捕获,且在 lambda 内使用时必须检查

1
2
QPointer<QObject> g { this->parent(); }
connect(..., [g]{ if (g) ... });

另一个线程的 QObject

必须以 shared_ptr 或者 weak_ptr 捕获,并且它的 parent 必须设为 nullptr

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
class I : public QObject {
  ...
  ~I() { setParent(nullptr); }
};

std::shared_ptr<I> i { new I };
connect(..., [i]{ ... });

std::weak_ptr<I> j { i };
connect(..., [j]{
  auto jp = j.lock();
  if (jp) { ... }
});