【发布时间】:2016-01-27 12:13:37
【问题描述】:
在topic 中,它告诉当一个 qobject 被删除时,它的活动连接将被删除。我有一个类似下面的案例:
Work* work = new Work();//->Work derived from QObject
Worker* worker = new Worker(work);//->Worker derived from QThread and has the ownership of work
connect(work, SIGNAL(percentageComplete(int)), progressDialog, SLOT(setValue(int)));
connect(worker, SIGNAL(finished()), worker, SLOT(deleteLater()));
progressDialog->show();
worker->start();
在工人的析构函数中我有:
Worker::~Worker(void){
if(work != nullptr){
work->deleteLater();
}
}
我 %100 确定该工作已被删除。我可以通过断点看到它。我什至可以看到 QObjects 的析构函数调用。
但有些已删除的工作对象仍然收到“完成百分比”信号。又因为被删了,造成了暗恋。
我想问为什么即使删除了对象也没有断开信号?
Worker 的析构函数work->deleteLater(); 或delete work; 中的第二个问题是否正确?
【问题讨论】:
-
您应该提供一个最小的工作示例。
-
deleteLater()应该用于延迟删除对象,因为它可能仍然需要 - 例如当你想删除它自己的插槽内的对象时。 -
“但有些已删除的工作对象仍然接收到信号“完成百分比” - 请澄清您确切看到的内容,添加崩溃的代码并添加回溯。在您的代码中,工作对象是发射 percentComplete,不接收它。如果发送方或接收方被破坏,信号/插槽连接将被破坏,所以我看不到你删除的工作人员如何发出信号。在你的情况下,删除应该是正确的。
-
请重新阅读您自己的问题,这似乎没有意义。为什么
work会收到it's ownpercentageCompleted` 信号?另外,我怀疑你在做错误的线程。如果您在线程中使用QObject实例,那么很可能您不应该覆盖QThread。 -
你们都是对的,阅读我自己的问题真的很有帮助。问题完全不同,并且与 lamdba 相关,没有自动断开连接。现在我应该怎么处理我的问题?我应该如何编辑它以使某些东西有用或至少不会令人困惑。