回答
下式成立:由當時的信號返回:
所有直接相連的槽已經被調用。
所有阻塞排隊的連接槽已被調用。
帶有排隊連接的插槽的所有目標對象都有相關的
QMetaCallEvent
發佈給他們。
因此,你有,如果你的其他代碼允許它你尋求充分的保證,如果連接是:
- 直接,
- 阻止排隊的,或
- 自動與當前線程中的目標對象。
使用這些連接類型,在信號方法返回之前,所有插槽都被調用。回想一下,信號是其他普通的C++方法,其實現由moc生成。
還記得自動連接類型在信號發出時被解析。如果目標對象位於當前線程中,則使用直接連接,否則會產生排隊連接。
當然,所有這些保證都假定您的插槽沒有修改對象!不要忘記,僅僅通過const引用傳遞對象是不夠的 - 畢竟,一些對象可能能夠直接訪問對象。代碼的設計必須解決您尋求的保證。
你保證,如果連接是一定不能成立:
- 排隊,或
- 自動在比當前線程其他線程的目標對象。
通過參考將數據傳遞到直接連接的時隙不復制實例:
//main.cpp
#include <QDebug>
class Data {
int m_i;
public:
Data(const Data & o) : m_i(o.m_i) {
qDebug() << "copy constructed";
}
Data(int i = 0) : m_i(i) {
qDebug() << "constructed";
}
Data(Data && o) : m_i(o.m_i) {
qDebug() << "move constructed";
}
~Data() {
qDebug() << "destructed";
}
int i() const { return m_i; }
};
Q_DECLARE_METATYPE(Data)
QDebug operator<<(QDebug dbg, const Data & d)
{
dbg << "Data:" << d.i();
return dbg;
}
class Object : public QObject {
Q_OBJECT
public:
Q_SIGNAL void source(const Data &);
Q_SLOT void sink(const Data & d) {
qDebug() << "sinking" << d;
}
};
int main()
{
qDebug() << QT_VERSION_STR;
Object o;
o.connect(&o, SIGNAL(source(Data)), SLOT(sink(Data)));
emit o.source(Data(2));
return 0;
}
#include "main.moc"
輸出:
4.8.6
constructed
sinking Data: 2
destructed
5.2.2
constructed
sinking Data: 2
destructed
好吧,完美!所以當編譯時,'signal'只是被一長串函數調用所取代。 – user3050215
@ user3050215信號不被任何東西代替,它是一個常規的C++方法調用。信號是一種常規方法,對於直接連接,本質上是迭代連接的函數指針列表並進行間接函數調用。當然,頂部櫻桃:) –
- 1. Qt信號/插槽發送一個完整的結構
- 2. Qt信號和插槽通過參考
- 3. QT信號未定義參考誤差
- 4. quantstrat信號參考其他信號
- 5. Qt信號插槽:信號已發送,但未插入插槽
- 6. Qt QTcpSocket在讀取數據時不發送信號
- 7. Qt的QSystemTrayIcon不發送激活信號
- 8. Qt NetworkAccessManager完成信號
- 9. Qt QML:獲取發射信號的對象的參考
- 10. Qt - 發送插槽而不是信號
- 11. 的Qt:發射信號
- 12. PyGTK的自定義信號發送列表作爲參數
- 13. qt發射信號如何將信號與併發線程一起工作
- 14. Qt - 基於信號內容將信號發送到特定對象
- 15. 參考數據完整性
- 16. Qt連接不同參數的信號
- 17. 行爲時,多個信號發送
- 18. Qt根據參數類型觸發不同的信號
- 19. 在等待超時時發送信號燈信號
- 20. 信號QT,QueuedConnection
- 21. 信號量是否「完整」?
- 22. QT插槽和信號參數
- 23. QT - 懸停QLabel時發出信號
- 24. 信號和Qt的
- 25. Qt信號 - 時隙交互。
- 26. 信號和(++ Qt的c)中時隙錯誤的值發送
- 27. 如何在PySide中將自身作爲參數發出信號?
- 28. Qt線程對象只發送信號爲Qt:DirectConnection - 爲什麼?
- 29. 流關閉時發送的信號
- 30. 虛擬Qt信號?
當您發送參考與信號一個對象,它被傳遞無論如何:http://qt-project.org/doc/qt-4.8/qmetaobject.html#normalizedSignature。 – vahancho
您應該考慮使用[Qt隱式數據共享](http://qt-project.org/doc/qt-5/implicit-sharing.html),就像Qt容器,'QString'和許多其他Qt數據類一樣。這與Qt信號和插槽一起運行良好。它可能不值得你的用例,但很高興知道它是可能的並且相對容易。 – hyde
@vahancho「當你發送一個帶有信號的對象的引用時,它就會作爲一個副本被傳送」**不,它不是**。至少在解析的連接類型不是直接的時候。 –