2011-02-24 56 views
0

我有一個從QObject繼承的類,它覆蓋了eventFilter()方法。它看起來像這樣:破壞從QObject繼承的類的對象

struct A 
{ 
    void DoSomething() 
    { 
    } 
}; 

struct B : public QObject 
{ 
    Q_OBJECT 
    B(QObject *parent, A &a_)) : QObject(parent), a(a_) 
    { 
    } 

    bool eventFilter(QObject * watched, QEvent * event) 
    { 
    if (QEvent::FocusOut == event->type()) 
    { 
     a.DoSomething(); 
     return true; 
    } 
    return QObject::eventFilter(watched, event); 
    } 

    A &a; 
}; 

這只是簡單的例子。現在在我的代碼中,類型A的對象(被傳遞給類型B的對象的構造函數)在qt開始銷燬繼承自QObject的對象之前被銷燬。

有沒有辦法告訴qt釋放類型B的對象?我不能簡單地刪除它,因爲qt會嘗試使用它並稍後釋放它。

回答

1

因爲B是一個事件過濾器,所以您需要找到它過濾的對象(或多個對象)並將它從這些對象中移除。此時,您應該可以刪除B而不會有任何問題。當QObject派生類被刪除時,Qt停止跟蹤它,並且不會在稍後嘗試刪除它。

+0

這個接縫工作。謝謝 – 2011-03-09 06:07:34

0

由於對象B需要A才能存活,所以如果它能夠保持活動狀態,即管理它的生存期(直接或通過共享指針),這將是公平的。如果A本身就是QObject,那麼可以使用Qt的object trees這個概念來自動管理它。如果不是的話,你可以創建一個獨立的QObject來管理A的生命週期,並使其成爲B的孩子。

0

你確定這是Qt特有的嗎?它看起來像你正在存儲對你的類中的A對象的引用,而不是在構造函數中複製A.這通常是問題的根源。

難道你不能把傳遞的A複製到內部A(而不是A &)?這是典型的設計。

+0

我不能複製類型A的對象,因爲上面只是一個簡化的例子。真正的類類型A從純基類繼承,並通過對基類的引用傳遞給類型B的對象。 – 2011-02-24 16:08:01

+0

它並不總是問題的來源,在很多情況下存儲參考文件是一個很好的選擇,例如對於短期存在的物體。然而@VJo的情況是不同的,我同意在這種情況下,僅僅存儲參考不是最好的選擇,儘管複製並不總是好的選擇。 – 2011-02-24 16:22:23