qt 继承的信号不会到达插槽

Posted

技术标签:

【中文标题】qt 继承的信号不会到达插槽【英文标题】:qt inherited signal won't reach to slot 【发布时间】:2011-06-06 04:17:29 【问题描述】:

这是我的问题的代码

class Base : QThread  

   Q_OBJECT  
 virtual void run() = 0;  
signals:  
 void Ping(int);  
;  

class Derived : public Base  
  
  void run()  
    
    emit Ping(42);  
    
  

信号(42) 不会到达/调用槽。怎么了? 提前致谢。

【问题讨论】:

【参考方案1】:

这样做了 100 次,它确实有效。你确定你的基类是正确的 MOC'ed 吗? (即在包含在 .pro 的 HEADERS 部分中的文件中定义)另外,在连接信号时,检查 QObject::connect 的返回状态(它是一个布尔值)。一个好的做法是这样的

bool r=false;
r=QObject::connect(pObj1,SIGNAL(signalStuff()),pObj2,SLOT(gotStuff()));
Q_ASSERT(r);

正如 Liz 所注意到的,如果您的 connect 出现问题,您可以检查跟踪以了解发生了什么。

我也可以注意:

您不必在基类中重新定义run,它已经由QThread 定义 QThread 的常见缺陷:基类和派生类属于创建它们的线程,而不是新创建的线程 您没有将信号连接到样本中的任何插槽,因此它不会触发任何东西(我想它已在其他地方完成) 您的 Derived 类缺少最终的 ;

编辑

编辑以考虑到 liz 的有趣评论。

【讨论】:

(不值得单独回答)检查程序的输出。如果连接调用出现问题,Qt 会将错误转储到控制台窗口。有时它就像一个错字一样简单。【参考方案2】:

我遇到了同样的问题,但设法找到了解决方案。我的问题不是继承(即使我确实从派生类发出)。

问题是调用发射信号的代码是在代码连接信号与插槽之前执行的。因此,两个信号都被发出并且信号槽连接工作正常,但槽中的代码没有执行,因为在连接槽到信号之前发生了发射。

也许这对将来的某人有帮助。

【讨论】:

【参考方案3】:

我认为您正在尝试连接来自不同线程的信号和插槽。 你读过this article吗?

【讨论】:

以上是关于qt 继承的信号不会到达插槽的主要内容,如果未能解决你的问题,请参考以下文章

Qt 信号继承?

Qt 信号和插槽发送结构数组

带信号/插槽的 PySide IPC

将 Worker Thread 信号与 MainWindow 插槽连接时出错(Qt5)

Qt UI Slot 不被从基类继承的信号调用

如何阻止信号到达自定义插槽