2012-05-11 93 views
0

如果它在對象上進行連接的地方很重要,那麼我正在編程。例如,通常我會在發出可能發出信號的呼叫之前執行此操作,但有時如果節點處於打開狀態(例如QNetworkReply不存在,直到進行呼叫)才需要執行此操作。也許我必須在連接之前做一些檢查。連接是在哪裏進行的?

在連接這個信號到一個插槽之前,有沒有可能發出信號?

例如:

ClassA::function() { 

    ClassB b; 

    b.someCall(); 

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

ClassB::someCall() { 

    emit finished(); 

} 

請問插槽在這裏叫什麼名字?這可能不是一個非常實用的例子,因爲在這種情況下,您可能只使用返回值。但是在某些情況下,我會這樣做,例如,如果「someCall」是一個例程,您可以一步步完成並且可能失敗,或者如果該例程中的網絡請求失敗,或者一開始就出現錯誤。無論哪種方式,應該發射「失敗()」信號並且有一個插槽來處理任何類型的故障。例如;

ClassB::someCall() { 

    allocate "something" 

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


    QNetworkReply *reply = someNetworkAccessManager.put(something); 

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

} 

所以在這裏我們有一個調用,它可以發出完成()幾乎直接或稍後。如果我在完成此調用後創建連接,那麼會完成第一個完成()嗎?

回答

1

不,商務部負責處理的QT連接宏的,並創建所需的所有基礎來做的信號和槽的魔力。只要moc將代碼添加到項目中的可見性在編譯器試圖解析函數調用時處於其範圍內,則一切都會好的。實際上,我們儘可能早地接通這些連接調用,即在聲明對象之後以及在使用之前,在標題中。

+0

您的回答與所要求的內容無關。只有最後一句意思是提供一個答案,但並不是真的。你必須小心生活在另一個線程中的QObject實例。否則,與構建QObject的信號源實例建立連接有多遠並無關緊要。只要你在連接建立之前不返回到事件循環,你就沒事。 –