Qt问题:
我从对象A发送信号,该对象A在线程A上运行到对象B,该对象B在线程B上运行。 我也通过覆盖对象B中的虚拟事件函数来处理自定义事件。
问题面临:当对象A发出任何信号时,对象B中的相应插槽没有被调用而不是被对象B覆盖的那个事件函数被调用。那么如何提取由QEvent对象接收的信号发送的参数通过对象B的事件函数或如何推迟该事件以便调用相应的槽。
对象A在gui线程中运行,其责任是更新gui。对象B正在实现gui逻辑并在不同的线程中运行。对象A通过信号和槽向对象B通知gui变化。对象B还处理来自另一个不是QThread的线程的事件。我正在使用自定义事件,并使用postEvent()函数来通知对象B.对象B具有用于接收自定义事件的覆盖事件功能。现在的问题是,当我从对象A向对象B发送任何信号以通知gui相关的更改时,它被事件函数捕获并且相应的插槽未被调用
答案 0 :(得分:0)
您的问题非常简单:当覆盖QObject::event
方法时,必须调用基类的实现。实际上,QObject::event
作用于QMetaCallEvent
并执行排队方法调用。
您应该执行以下操作:
class MyObject : public QObject {
Q_OBJECT
protected:
bool event(QEvent * ev);
...
};
bool MyObject::event(QEvent * ev) {
if (ev->type() == MyEventType) {
...
return ...;
}
else
return QObject::event(ev);
}