2011-04-17 79 views
0

是否可以在不連接它們的情況下向插槽發送信號? 有一個類有一個顯示一些日誌的SLOT。 現在我們沒有任何信息將會使用多少個類將信號發送到這個日誌槽,我們也不能相互發送它們的對象,但是每個對象都可能發送日誌請求。Qt匿名信號

回答

4

您可以像調用普通成員函數一樣調用對象的(公共)插槽。連接不是必需的。

此外,您不需要事先知道誰將連接到給定的插槽。連接可以發生在班級之外。 (至少公開插槽)

0

我認爲沒有這種可能性。但是,也許你可以使log()方法成爲靜態的,這樣你就可以在不引用記錄器對象的情況下調用log()方法?

3

是的,你可以用幾種方法。

您可以像其他任何C++函數一樣調用該插槽(如果它是public)。插槽仍然是C++函數。缺點是調用者需要在編譯時知道接收者的接口。

logger.log("The frobnitz could not be quuxed"); 

您可以通過QMetaObject::invokeMethod調用插槽。使用這種方法,調用者不需要關於收件人的任何編譯時信息,除了它是QObject*

if (!QMetaObject::invokeMethod(logger, "log", Q_ARG(QString, "The frobnitz could not be quuxed"))) { 
    qWarning("Internal error: logging failed (did someone change the logger API?)"); 
} 
+0

雖然這是真的,你可以調用一個插槽與任何常規方法(因爲它是一個正常的方法),該解決方案是更清潔,因爲它實際上將排隊的行動,並讓事件循環處理它。在線程之間傳遞消息時,以及如果您需要更多動態消息傳遞,這就是要走的路。 – 2014-02-25 21:33:37