1.QT信號與槽的底層原理?
- 底層通過元對象系統和事件循環完成的,能夠在運行期間動態處理信號槽之間的連接與斷開,而不是像函數調用那樣在編譯期間就完全確定了。
- 元對象系統包含:QObject類、Q_OBJECT宏定義、moc編譯器
- 當發送一個信號,由moc編譯器生成一個函數,這個函數會根據信號的簽名找到所有的槽函數,并把信號的參數傳遞給槽
- 信號本質上是一個函數,但他并不調用槽函數,而是通過QT內部機制間接調用,這種間接性也讓信號槽跨線程工作,甚至運行時可以動態地連接與斷開。
2.想要聲明和使用信號槽需要哪些前提條件?
- 繼承Object類
- 私有作用域下需要Q_OBJECT這個宏定義
3.信號槽是什么?
信號與槽(Signals & Slots) 是一種用于對象間通信的機制,它是 Qt 的核心特性之一。
基本語法:QObejct::connect(發送者指針, &發送者類::信號, 接收者指針, &接收者類::槽);
4.connection槽函數的連接方式:
- 自動連接(Auto Connection):
默認的連接方式,發送和接收者在同一個線程中,自動使用直接連接,不在同一個線程中,使用隊列連接
- 直接連接(Direct Connection):
同一線程中使用,信號發送時,槽函數就被調用,效果就像同步的函數調用。
- 隊列連接(Queued Connection):
同一或不同線程中使用,信號發送后會被暫時放在消息隊列中(發送者線程不阻塞),需要接收對象所屬的線程事件循環有控制權了才能獲取信號,執行槽函數。
- 阻塞連接(Blocking Queued Connection):
只能在不同線程中使用(同一線程中會死鎖),調用過程和上一個一致,不過發送者發送信號后所在線程會阻塞,直到槽函數運行完。
- 唯一連接(Unique Connection):
作為與上面四個進行按位或的,避免重復連接。
5.Qt中的.pro文件是什么
工程文件,在其中聲明依賴的模塊,通過qmake自動鏈接庫文件。
比如我的項目中使用了TCP協議通信(UDP、HTTP、SSL都行),需要定義庫文件#include<QTcpSocekt>和#include<QTcpServer>時,需要在.pro工程文件中加入網絡模塊:QT+=network
6.為什么當前父類下子類new出的對象不必析構?
Qt對象樹模型中,父類銷毀,子類也會銷毀,所以子類的new出來的對象不用管