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 继承的信号不会到达插槽的主要内容,如果未能解决你的问题,请参考以下文章