![](/img/trans.png)
[英]Can I delete an object owned by another with a callback from the object to be deleted?
[英]How can I pass a QEvent to an object owned by the receiver?
如何通過QObject :: event()函數將類接收到的事件傳遞給其數據成員之一,然后該數據成員將處理該事件?
例如,如果我有
class A
{
B b;
public:
event(QEvent *);
//other members and functions
};
和
class B
{
public:
event(QEvent *);
//other members
};
假設我從另一個函數發送事件,事件過濾器的對象A
使用postEvent()
從我的理解,該event()
的函數A
接收事件。 有沒有辦法將事件傳遞給A
, B
的成員,然后由后者處理事件?
使用QCoreApplication::sendEvent
:
class B : public QObject
{
public:
bool event(QEvent *);
};
class A : public QObject
{
// Correct
B b{this};
// Wrong
B bad;
public:
bool event(QEvent * ev) override {
if (ev->type() == my_event_type) {
// Correct
return QCoreApplication::sendEvent(&b, ev);
// Wrong
return b.event(&ev);
}
return QObject::event(ev);
}
};
在C ++ 98中,如果沒有統一的初始化,則必須使用初始化列表:
class A : public QObject
{
B b;
public:
A(QObject * parent = 0) : QObject(this), b(this) {}
bool event(QEvent * ev) { /*...*/ };
};
B
的親子關系對於確保其與A
處於同一線程中至關重要。 A
用戶可以自由地將其移動到任何線程-這是QObject
的約定(打破它是一個壞主意)。 當它們這樣做時,除非B
在同一線程中,否則sendEvent
會變成未定義的行為。 保證相關對象遵循線程的規范方法將其更改為將它們作為要跟蹤的對象的父對象。
不要直接調用QObject::event()
:它只能由Qt調用。 直接調用它將繞過事件過濾器,並導致B
行為不像QObject
。 QObject
合同的一部分是事件過濾器(各個級別)可以修改其功能。 直接調用event()
會破壞B
所有用戶的 LSP ! :他們將使用QObject
,但它的行為不再像QObject
那樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.