新的Qt5信号和槽语法使我们不仅可以将信号连接到槽,还可以连接到普通函数和函数对象/lambda。现在问题是,lambda本质上是带有()运算符的对象,当您将信号连接到它们时,它们会被复制到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,这意味着函数对象本身仍然存在并正常运行,尽管对我来说已经没有用处了。我有什么遗漏吗?
QMetaObject::Connection
дҪҝз”ЁзӣёеҗҢзҡ„еҸӮж•°йҮҚж–°иҝһжҺҘеҗ—пјҹиҝҷеҸҜд»Ҙи§ЈйҮҠдёәд»Җд№Ҳе®ғдҝқз•ҷеҜ№иҜҘеҮҪж•°зҡ„еј•з”ЁгҖӮ - Reuben Morais