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

Posted

技术标签:

【中文标题】Qt - 由 qt 对象发送的信号调用由接收器对象覆盖的事件函数【英文标题】:Qt - Signal send by a qt object invoked the event function overridden by receiver object 【发布时间】:2014-08-28 12:32:17 【问题描述】:

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

【问题讨论】:

您能否提供一些代码来解释您要做什么? 如果问题包含 mvce,则会获得更多可见性:***.com/help/mcve 这个问题不需要任何代码:) 它是用非常清晰的散文写的。 +1 【参考方案1】:

您的问题很简单:当覆盖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);

【讨论】:

不要使用 cmets 表示“谢谢”。说“好答案”的一种方式是点赞,如果有不止一次,则接受最好的答案。

以上是关于Qt - 由 qt 对象发送的信号调用由接收器对象覆盖的事件函数的主要内容,如果未能解决你的问题,请参考以下文章

Qt 拾遗 003 disconnect

Qt5跨线程信号和槽

[Qt] Qt信号槽

3.信号槽

qt中信号与槽机制

如何向 Qt 中 QThread 类的特定对象发出信号?