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

时间:2011-06-06 04:17:30

标签: qt inheritance signals-slots multithreading

这是我的问题代码

class Base : QThread  
{
   Q_OBJECT  
 virtual void run() = 0;  
signals:  
 void Ping(int);  
};  

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

信号(42)不会到达/呼叫插槽。怎么了? 提前谢谢。

3 个答案:

答案 0 :(得分:5)

这样做了100次,确实有效。你确定你的基类是正确的MOC吗? (即在.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'有趣的评论。

答案 1 :(得分:0)

我认为你正试图从不同的线程连接信号和插槽。 你看过this article吗?

答案 2 :(得分:0)

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

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

也许这有助于将来。