Qt

Pejay23發表於2020-12-17

Qt 訊號槽 和 回撥函式的區別
回撥函式的本質是“你想讓別人的程式碼執行你的程式碼,而別人的程式碼你又不能動”這種需求下產生的。

回撥函式是函式指標的一種用法,如果多個類都關注某個類的狀態變化,此時需要維護一個列表,以存放多個回撥函式的地址。對於每一個被關注的類,都需要做類似的工作,因此這種做法效率低,不靈活。
Qt訊號與槽機制降低了Qt物件的耦合度。
訊號槽 訊號傳送者不需要知道訊號接收者的資訊
型別安全 相關聯的訊號槽引數必須匹配才可以 任意型別 任意引數
QT:
1:QT訊號槽機制的優缺點 :
1)QT訊號槽機制的引用精簡了程式設計師的程式碼量 (不用寫回撥函式)
2)QT的訊號可以對應多個槽(但他們的呼叫順序隨機),也可以多個槽對映一個訊號
3)QT的訊號槽的建立和解除繫結十分自由
4)訊號槽同真正的回撥函式比起來時間的耗損還是很大的,所有在嵌入式實時系統中應當慎用
5)訊號槽的引數限定很多例如不能攜帶模板類引數,不能出現巨集定義等等

2、多執行緒情況下, Qt中的訊號槽分別在什麼執行緒中執行, 如何控制?

可以通過connect函式的第五個引數來控制, 訊號槽執行時所在的執行緒

1)自動連線(AutoConnection),預設的連線方式,如果訊號與槽,也就是傳送者與接受者在同一執行緒,等同於直接連線;如果傳送者與接受者處在不同執行緒,等同於佇列連線。
2)直接連線(DirectConnection),當訊號發射時,槽函式立即直接呼叫。無論槽函式所屬物件在哪個執行緒,槽函式總在傳送者所線上程執行,即槽函式和訊號傳送者在同一執行緒
3)佇列連線(QueuedConnection),當控制權回到接受者所線上程的事件迴圈時,槽函式被呼叫。槽函式在接受者所線上程執行,即槽函式與訊號接受者在同一執行緒

3、描述QT中的檔案流(QTextStream)和資料流(QDataStream)的區別, 他們都能幫助我們完成一些什麼事情.
QTextStream – 文字流, 操作輕量級資料(int, double, QString), 資料寫入檔案中之後以文字的方式呈現。
QDataStream – 資料流, 通過資料流可以操作各種資料型別, 包括類物件, 儲存到檔案中資料可以還原到記憶體。
QTextStream, QDataStream可以操作磁碟檔案, 也可以操作記憶體資料, 通過流物件可以將資料打包到記憶體, 進行資料的傳輸.

4、描述Qt下Tcp通訊的整個流程
具體解釋 :https://www.cnblogs.com/yuweifeng/p/9382841.html

QT如果要進行網路程式設計首先需要在.pro中新增如下程式碼:QT += network

伺服器端:

  1. 建立用於監聽的套接字
  2. 給套接字設定監聽
  3. 如果有連線到來, 監聽的套接字會發出訊號newConnected
  4. 接收連線, 通過nextPendingConnection()函式, 返回一個QTcpSocket型別的套接字物件(用於通訊)
  5. 使用用於通訊的套接字物件通訊
    1>. 傳送資料: write
    2>. 接收資料: readAll/read
    客戶端:
  6. 建立用於通訊的套接字
  7. 連線伺服器: connectToHost
  8. 連線成功與伺服器通訊
    1>. 傳送資料: write
    2>. 接收資料: readAll/read

6、描述QT下udp通訊的整個流程

QT下udp通訊伺服器端和客戶端的關係是對等的, 做的處理也是一樣的.

  1. 建立套接字物件
  2. 如果需要接收資料, 必須繫結埠
  3. 傳送資料: writeDatagram
  4. 接收資料: readDatagram

7: 描述QT下多執行緒的兩種使用方法, 以及注意事項
第一種方法:

  1. 建立一個類從QThread類派生
  2. 在子執行緒類中重寫 run 函式, 將處理操作寫入該函式中
  3. 在主執行緒中建立子執行緒物件, 啟動子執行緒, 呼叫start()函式
    第二種方法:
  4. 將業務處理抽象成一個業務類, 在該類中建立一個業務處理函式
  5. 在主執行緒中建立一QThread類物件
  6. 在主執行緒中建立一個業務類物件
  7. 將業務類物件移動到子執行緒中
  8. 在主執行緒中啟動子執行緒
  9. 通過訊號槽的方式, 執行業務類中的業務處理函式
    多執行緒使用注意事項:
    1. 業務物件, 構造的時候不能指定父物件
    1. 子執行緒中不能處理ui視窗(ui相關的類)
    1. 子執行緒中只能處理一些資料相關的操作, 不能涉及視窗

Qt訊號槽的實現原理其實就是函式回撥,不同的是直連直接回撥、佇列連線使用Qt的事件迴圈隔離了一次達到非同步,最終還是使用函式回撥

moc預編譯幫助我們構建了訊號槽回撥的開頭(訊號函式體)和結尾(qt_static_metacall回撥函式),中間的回撥過程Qt已經在QOjbect函式中實現
signals和slots就是為了方便moc解析我們的C++檔案,從中解析出訊號和槽
訊號槽總共有5種連線方式,前四種是互斥的,可以表示為非同步和同步。第五種唯一連線時配合前4種方式使用的
訊號和槽本質上是一樣的,但是對於使用者來說,訊號只需要宣告,moc幫你實現,槽函式宣告和實現都需要自己寫
connect方法就是把傳送者、訊號、接受者和槽儲存起來,供後續執行訊號時查詢
訊號觸發就是一系列函式回撥

相關文章