在哪里建立连接是否重要

Does it matter where the connection is made?

本文关键字:是否 连接 建立 在哪里      更新时间:2023-10-16
如果连接

在对象上的位置很重要,我就会感到不安。例如,通常我会在发出可能发出信号的调用之前执行此操作,但有时如果它是节点,例如在调用之前不存在的 QNetworkRep,我必须在之后执行此操作。也许在建立连接之前,我还必须进行一些检查。

建立连接以将此信号连接到插槽之前,是否有可能发出信号?

例如:

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())); 
}

所以这里我们有一个调用,它几乎可以立即发出 finish((,或者在一段时间后发出。如果我在进行此调用后创建连接,第一个 finish(( 会被捕获吗?

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