0

我想知道在对象上建立连接的位置是否重要。例如,通常我在发出可能发出信号的调用之前执行此操作,但有时如果它的节点位于(例如在调用之前不存在的 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()。如果我在拨打此电话后创建连接,是否会捕获第一个 finished() ?

4

1 回答 1

1

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

于 2012-05-11T01:05:02.050 回答