Qt - 由qt对象发送的信号调用由接收器对象覆盖的事件函数

时间:2014-08-28 12:32:18

标签: qt signals-slots qt4.8 qevent

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相关的更改时,它被事件函数捕获并且相应的插槽未被调用

1 个答案:

答案 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);
}