gpt4 book ai didi

c++ - 如何将 QEvent 传递给接收者拥有的对象?

转载 作者:行者123 更新时间:2023-11-28 01:52:39 28 4
gpt4 key购买 nike

类如何通过QObject::event()接收事件函数被传递给它的数据成员之一,然后由它处理事件?

例如,如果我有

class A
{
B b;
public:
event(QEvent *);
//other members and functions
};

class B
{
public:
event(QEvent *);
//other members
};

假设我使用 postEvent() 从另一个函数(一个事件过滤器)将事件发送到 A 的对象,据我所知,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) { /*...*/ };
};

要避免的陷阱

  1. B 的出身关系对于确保它与 A 位于同一线程中至关重要。 A 的用户可以自由地将它移动到任何线程——这是 QObject 的契约(破坏它是个坏主意)。当它们这样做时,sendEvent 会变成未定义的行为,除非 B 在同一个线程中。确保相关对象跟随线程的规范方法将其更改为它们应该跟踪的对象的父级。

  2. 不要直接调用 QObject::event():它只能由 Qt 调用。直接调用它会绕过事件过滤器并导致 B 的行为不像 QObjectQObject 契约的一部分是事件过滤器(在不同级别)可以修改它的功能。直接调用 event() 会中断 LSP对于 B 的所有用户!:他们会使用 QObject,但它不像 QObject 会了。

关于c++ - 如何将 QEvent 传递给接收者拥有的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42352525/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com