如何将 QEvent 传递给接收者拥有的对象?
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
};
假设我使用postEvent()
将事件从另一个函数(事件过滤器)发送到A
的对象,据我了解,A
的event()
函数接收事件。有没有办法将事件传递给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
的合约(破坏它是一个坏主意)。当他们这样做时,sendEvent
变成未定义的行为,除非B
在同一线程中。确保相关对象遵循线程的规范方法将其更改为它们应跟踪的对象。不要直接调用
QObject::event()
:它只能由Qt调用,直接调用它会绕过事件过滤器,导致B
的行为不像QObject
。QObject
契约的一部分是事件过滤器(在不同级别)可以修改其功能。直接调用event()
会破坏B
所有用户的LSP!:他们将使用QObject
,但它不再像QObject
那样工作。
相关文章:
- 在 c++ 中拥有一组结构的正确方法是什么?
- 我应该如何表示我拥有的连续元素序列?
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 现代 C++ 中作为类成员的非拥有指针
- 结构包含在两个头文件中,这两个文件我都不拥有
- 在函数中拥有函数原型的目的是什么?
- condition_variable、引用和线程:谁拥有锁?
- 为什么我能够为阵列分配比计算机实际拥有的内存更多的内存
- 有没有办法在 c++ 中拥有条件预处理器
- 为什么我不能拥有某些私有会员功能?
- 如何拥有受约束的运算符模板?
- 我的 c++ 程序似乎没有发现字符串和我拥有但输入使用 getline 的变量之间的比较
- CBasePin 递增对拥有过滤器的引用.循环引用?
- 谁拥有作为指向 Windows API 函数的指针传递的值?
- 是否可以获取成员函数模板参数的拥有对象?
- 拥有或在对象之间共享资源
- C++可以在全局范围内拥有代码吗?
- 如何在一个功能中拥有所有选项?
- 让线程拥有它C++运行的函子
- 如何将 QEvent 传递给接收者拥有的对象?