關於QT信號和槽機制的重復綁定錯誤及改正
阿新 • • 發佈:2017-10-24
之前 位置 對象 綁定 會銷 改變 設計 界面 再次
之前做過一個作業,是編寫五子棋、圍棋遊戲,因為需要界面,所以選擇了QT框架。Qt 的核心機制之一是信號與槽,主要用來進行兩個對象之間的通信。當一個對象狀態改變時,可以發出一個信號,另一個對象則執行與這個信號綁定的槽函數,這種方式可以用來傳遞參數,也可以進行反饋行為。
這次作業主要涉及了三個類,分別為玩家類、棋盤類和棋局類。玩家類保存玩家信息,棋盤類保存棋盤上的落子信息,棋局類則保存對局信息(勝負、計時等),兩個玩家可以多次對弈。這次作業中的其中一個步驟是玩家點擊棋盤位置後,發出信號,然後棋盤進行落子。進行測試的時候,單次棋局無錯誤,但是一旦結束棋局,兩個玩家退出後再次進入,就會發生錯誤,玩家單次點擊會觸發多次落子,且重進棋局次數越多,單次點擊後的落子次數越多。
經過多次測試之後發現,在進入棋局的時候進行了兩個玩家之間的信號綁定,退出棋局不會銷毀玩家間的信號,因此相同的兩個玩家再次進入棋局則會導致對同一個信號和槽再次進行綁定,所以單次點擊會多次發出同一信號。網上查閱解決辦法,得知可以設置參數使得信號只綁定一次,但是嘗試後無效,。因此,改變設計思路,將兩個玩家間的信號綁定改變為玩家與棋局之間的信號綁定,借由棋局來傳遞消息。當退出棋局時,棋局對象銷毀,信號也隨之銷毀,這樣就不會產生重復綁定的情況,問題得以解決。
關於QT信號和槽機制的重復綁定錯誤及改正