【问题标题】:Does it matter where the connection is made?在哪里建立连接是否重要?
【发布时间】:2012-05-11 00:37:18
【问题描述】:

我想知道在对象上的连接位置是否重要。例如,通常我在发出可能发出信号的调用之前执行此操作,但有时如果它的节点位于(例如在调用之前不存在的 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() ?

【问题讨论】:

    标签: c++ qt signals-slots


    【解决方案1】:

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

    【讨论】:

    • 您的回答与所问的内容无关。只有最后一句旨在提供答案,但实际上并非如此。您必须小心存在于另一个线程中的 QObject 实例。否则,与 QObject 的信号源实例的构造建立多远的连接绝对无关紧要。只要在连接建立之前不返回事件循环就可以了。
    • @Kuba Ober 他特别询问是否可以在建立连接之前发出信号。第一个词回答了他的问题,其余的解释了为什么不是。如果 QObject 没有用于正在发射的信号的插槽,它将不会接收到该信号,并且所有这些都由 moc 处理。你必须小心多线程期间。这就是为什么我们有像 std::mutex 和 std::lock_guard 这样的线程原语。
    猜你喜欢
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多