新QT5信号和槽语法允许我们连接信号不仅插槽,而且还颠覆了旧的功能和仿函数/ lambda表达式。 现在的问题是,lambda表达式与()运算符essentialy对象,而当你的信号连接到它们,它们就在QT内部类地方复制。 而且,当你从该函子断开信号,它停留在QT内部。 我不明白,是一种正常的行为? 或者,也许有一种方法来破坏断线后的功能对象?
下面是一个例子:
//example
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTimer* timer = new QTimer();
QSharedPointer<QMetaObject::Connection> connection(new QMetaObject::Connection());
//functor is created and gets copied inside qt internals, connection variable is captured
//inside the functor
*connection.data() = QObject::connect(timer, &QTimer::timeout, [=]
{
qDebug() << "disconnected";
QObject::disconnect(*connection.data());
});
timer->start(10000);
return a.exec();
}
//example
现在,当我插槽断开后看连接变量的强引用计数,它停留2,这意味着仿函数对象本身是仍然健在的,虽然它是没有用的我。 难道我错过了什么?