连接的位置是否重要?

时间:2012-05-11 00:37:19

标签: c++ qt signals-slots

如果在一个物体上建立连接很重要,那我就开始讨厌了。例如,在我进行可能发出信号的调用之前,通常我会这样做,但有时我必须在事后进行,如果它是节点,例如QNetworkReply在调用之前不存在。也许我必须在进行连接之前进行一些检查。

在连接此信号到插槽之前,是否有可能发出信号?

例如:

ClassA::function() {

   ClassB b;

   b.someCall();

   connect(&b, SIGNAL(finished()), this, SLOT(someSlot()));
}

ClassB::someCall() {

    emit finished();

}

这里会调用插槽吗?这可能不是一个非常实用的例子,因为在这种情况下你可能会使用返回值。但在某些情况下我会这样做,例如,如果“someCall”是一个可以逐步执行的例程,它可能会失败,或者如果该例程中的网络请求失败,或者我们在开始时遇到一些错误。无论哪种方式,都应该发出“failed()”信号,并有一个槽来处理任何类型的故障。例如;

ClassB::someCall() {

   allocate "something"

   if(something == NULL) emit finished();


   QNetworkReply *reply = someNetworkAccessManager.put(something);

   connect(reply, SIGNAL(finished()), this, SIGNAL(finished())); 

}

所以在这里我们有一个调用,它可以直接或稍后发出finished()。如果我在进行此调用后创建连接,是否会捕获第一个完成的()?

1 个答案:

答案 0 :(得分:1)

不,moc处理QT的连接宏,并创建了完成信号和插槽魔术所需的所有基础。只要moc将代码添加到项目中的可见性在编译器尝试解析函数调用时都在编译器的范围内,一切都会好的。在实践中,我们尽可能早地进行这些连接调用,即在声明对象之后,以及在使用之前,在标题中。