如何通过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
,DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference();
的成员,然后处理该事件?
答案 0 :(得分:2)
使用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
的合同(打破它是一个坏主意)。当他们这样做时,sendEvent
变成未定义的行为,除非B
在同一个线程中。确保相关对象遵循线程的规范方式将其更改为父级,以便跟踪它们应跟踪的对象。
不要直接调用QObject::event()
:它只是由Qt调用。直接调用它会绕过事件过滤器,导致B
不像QObject
那样行事。 QObject
合同的一部分是事件过滤器(在各个级别)可以修改其功能。直接调用event()
会导致所有B
个用户的LSP中断!:他们将使用QObject
,但它会不再像QObject
那样。