QT狀態機框架

2021-05-21 22:55:47 字數 1180 閱讀 4678

qt的state machine framework是在qt4.6中引入的,其理論基礎是harel的statechart,通過定義一系列的可能狀態,以及系統如何在這些狀態中進行轉換(transitions between states)來描述整個狀態機的執行。

qt的狀態機體系主要包括三部分模組:

光有狀態機本身,只是定義狀態轉換,什麼事情也不做的話,這樣的狀態機也就沒有什麼用

你可以定義乙個永不結束的狀態機,也可以通過qfinalstate給狀態機新增乙個「結束狀態」,當狀態機轉換到這個狀態以後,整個狀態機就會結束並退出執行。

狀態的轉換,不受巢狀機制的影響,也就是說你可以定義從任意層級的狀態轉換到其它狀態。

狀態轉換可以配合animation相關類,實現物件屬性值的動畫效果。針對一些邊際場合,state相關類還提供的函式用於判定屬性值是否已經完成賦值(如果在動畫過程中,屬性值是在變化的,不算賦值完畢),以及動畫完成前,狀態提前退出時的屬性引數設定設定機制等。

qhistorystate類,並不像我所想象的那樣,是用來跟蹤和記錄歷史狀態的記錄堆疊。到底是什麼用途,看看如何使用它就知道了。

qhistorystate必須被新增為乙個父狀態組的成員狀態。當父狀態組退出**換到狀態組外部的其它狀態)時,會自動把當前的狀態記錄到qhistorystate中,外部狀態轉換回來時,不需要知道原先的狀態是該狀態組中具體的哪乙個,只需要轉向狀態組中的歷史狀態成因就可以了。

所以,歷史狀態的使用,應該更多的是為了記錄乙個被打斷的狀態,比如跳到乙個外部狀態處理一些事情,然後再返回到被打斷的狀態。

所謂無目標狀態轉換(targetless transitions),是指當乙個狀態轉換動作被觸發時,並不轉向另乙個狀態,只是觸發乙個qabstracttramsotopm::triggered訊號。你可以鏈結這個訊號來做一些處理。

需要注意的是:targetless transitions是通過初始化乙個transition類時,不指定目標狀態來實現的,如果明確指定的目標狀態為源狀態(比如s1->s1),那麼該狀態會先退出,再進入,從而依次觸發qabstractstate::entered和qabstractstate::exited 訊號。

本來,圖形介面應用程式程式設計多數都是使用者互動驅動的,似乎並沒有什麼特殊的地方一定需要使用狀態機驅動來輔助,不知道有什麼應用場景,是特別適合使用狀態機的?

qt 狀態機小記

狀態機 狀態 訊號 狀態機框架與qt的元物件系統是緊密結合的,例如qt的事件系統用來驅動狀態機,狀態機中狀態間的切換可以由訊號來觸發。關於狀態機可以參考the state machine framework關鍵字。如下的示例中,狀態機被乙個按鈕控制,包含3個狀態s1 s2 s3,s1為初始狀態,當單...

qt狀態機的實現

建立狀態,設定狀態中的屬性,設定初始狀態,設定狀態裝換條件 動畫,啟動狀態機 int nmargin 9 int ninitwidth m pselmoldform width int ninitheight m pselmoldform height int nconfepyformw m pco...

狀態機 狀態機0

近半年都忙於做專案,沒有太多的時間去整理和總結在專案中用過的技術 個人還是覺得技術需要總結提煉和沉澱的,忙到沒時間去總結提公升其實不 是什麼好事,這次講下狀態機,在戰鬥型別的遊戲中角色有多種不同的狀態,而狀態的切換錯綜複雜,23種設計模式中有一種模式叫做狀態模式,不過 這種模式是把狀態切換條件放到各...