【问题标题】:qt inherited signal won't reach to slotqt 继承的信号不会到达插槽
【发布时间】: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) 不会到达/调用槽。怎么了? 提前致谢。

【问题讨论】:

    标签: qt inheritance signals-slots multithreading


    【解决方案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吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-12
        • 1970-01-01
        • 1970-01-01
        • 2012-09-11
        • 2016-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多