2011-06-06 24 views
1

这里是我的问题QT继承信号将不会达到插槽

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

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

的代码信号(42)将不会到达/来电插槽。怎么了? 在此先感谢。

回答

5

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

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

随着莉斯发现,如果事情在你的connect出了问题,你可以检查的痕迹就知道发生了什么。

我还可以注意到:

  • 你没有在你的基类来重新定义run,它已经通过QThread
  • 常见的陷阱与QThread定义:基类和派生类属于线程而不是在新创建的线程
  • 你不把你的信号连接到你的示例中的任何插槽,所以它不会触发任何东西(我想它是在别处完成的)
  • 你的类派生d缺乏最终;

编辑

编辑,以兼顾Liz的有趣评论。

+1

(不值得一个单独的答案)检查你的程序的输出。如果连接调用有问题,Qt会将错误转储到控制台窗口。有时候就像打字错误一样简单。 – Liz 2011-06-06 22:06:02

+0

该死的真的,编辑我的文章,以考虑到这一点,thx利兹 – Bruce 2011-06-07 05:22:34

0

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

0

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

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

也许这对未来有帮助。