1

Qt问题:

我正在从在线程 A 上运行的对象 A 向在线程 B 上运行的对象 B 发送信号。我还通过覆盖对象 B 中的虚拟事件函数来处理自定义事件。

面临的问题:当对象 A 发出任何信号时,对象 B 中的相应插槽不会被调用,而不是被对象 B 覆盖的事件函数被调用。那么如何从事件函数接收的 QEvent 对象中提取信号发送的参数对象 B 或如何推迟该事件以便调用相应的插槽。

对象 A 在 gui 线程中运行,它的职责是更新 gui。对象 B 正在实现 gui 逻辑并在不同的线程中运行。对象 A 正在通过信号和槽向对象 B 通知 gui 更改。对象 B 还处理来自另一个不是 QThread 的线程的事件。我为此使用自定义事件,并为此使用 postEvent() 函数来通知 Object B 。对象 B 具有用于接收自定义事件的覆盖事件函数。现在的问题是,当我从对象 A 向对象 B 发送任何信号以通知与 gui 相关的更改时,它被事件函数捕获并且相应的插槽没有被调用

4

1 回答 1

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);
}
于 2014-08-28T12:57:59.137 回答