欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Qt利用QState狀態(tài)機實現(xiàn)控件互斥操作詳解

 更新時間:2022年12月05日 14:09:03   作者:中國好公民st  
這篇文章主要為大家詳細介紹了Qt如何利用QState狀態(tài)機實現(xiàn)控件互斥操作,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下

最近學習了QState狀態(tài)機功能,今天為大家分享下如何實現(xiàn)按鈕的互斥效果吧。

首先,看一下實現(xiàn)效果~

功能講解

開發(fā)環(huán)境:VS2017 + Qt5.14.2

該例子實現(xiàn)了類似于QRadioButton的效果。

從QtDesigner中拖出了三個QPushButton控件,分別是:ui.btn1、ui.btn2、ui.btn3,每個按鈕都有對應的狀態(tài),分別是:state1、state2、state3

選中后背景顏色值是:QColor(255,182,193)、未選中的背景顏色值是:QColor(255,239,213);

設置步驟

1:設置btn1對應的狀態(tài)信息

QState *state1 = new QState;
state1->assignProperty(ui.btn1, "text", QStringLiteral("1選中"));
state1->assignProperty(ui.btn1, "styleSheet", "background-color:rgb(255,182,193)");
state1->assignProperty(ui.btn2, "text", QStringLiteral("2"));
state1->assignProperty(ui.btn2, "styleSheet", "background-color:rgb(255,239,213)");
state1->assignProperty(ui.btn3, "text", QStringLiteral("3"));
state1->assignProperty(ui.btn3, "styleSheet", "background-color:rgb(255,239,213)");

代碼講解使用QState::assignProperty,指示此狀態(tài)在進入狀態(tài)時將具有給定對象的給定名稱的屬性設置為給定值。

通俗來說,就是響應狀態(tài)需要讓哪些按鈕做什么樣的操作。

在響應state1狀態(tài)時,btn1的文字變成了"1選中",背景顏色也發(fā)生了變化,同理,state2、state3也是如此。

2:設置btn2對應的狀態(tài)信息

QState *state2 = new QState;
state2->assignProperty(ui.btn1, "text", QStringLiteral("1"));
state2->assignProperty(ui.btn1, "styleSheet", "background-color:rgb(255,239,213)");
state2->assignProperty(ui.btn2, "text", QStringLiteral("2選中"));
state2->assignProperty(ui.btn2, "styleSheet", "background-color:rgb(255,182,193)");
state2->assignProperty(ui.btn3, "text", QStringLiteral("3"));
state2->assignProperty(ui.btn3, "styleSheet", "background-color:rgb(255,239,213)");

3:設置btn3對應的狀態(tài)信息

QState *state3 = new QState;
state3->assignProperty(ui.btn1, "text", QStringLiteral("1"));
state3->assignProperty(ui.btn1, "styleSheet", "background-color:rgb(255,239,213)");
state3->assignProperty(ui.btn2, "text", QStringLiteral("2"));
state3->assignProperty(ui.btn2, "styleSheet", "background-color:rgb(255,239,213)");
state3->assignProperty(ui.btn3, "text", QStringLiteral("3選中"));
state3->assignProperty(ui.btn3, "styleSheet", "background-color:rgb(255,182,193)");

4:設置停止狀態(tài)

當設置了所有控件對應的狀態(tài)后,最后需要設置停止狀態(tài)。停止狀態(tài)是一個單獨的狀態(tài)類:QFinalState。

QFinalState *stateFinal = new QFinalState;

5:數(shù)據(jù)綁定

每個單獨的狀態(tài)設置完成后,那么該如何對狀態(tài)以及按鈕做綁定呢?

state1->addTransition(ui.btn1, &QPushButton::clicked, state1);
state2->addTransition(ui.btn2, &QPushButton::clicked, state2);
state3->addTransition(ui.btn3, &QPushButton::clicked, state3);

6:將所有的狀態(tài)添加到狀態(tài)機QStateMachine中

QStateMachine *pMachine = new QStateMachine;
pMachine->addState(state1);
pMachine->addState(state2);
pMachine->addState(state3);
pMachine->addState(stateFinal);

7:設置初始化狀態(tài)

上述工作完成后,必須要給狀態(tài)機設置初始狀態(tài),并且狀態(tài)必須是這個狀態(tài)的子狀態(tài)。

pMachine->setInitialState(state1);

8:開始運行狀態(tài)

pMachine->start();

好了,根據(jù)上述代碼,進行調試運行試試?

結果發(fā)現(xiàn),無論點擊哪個按鈕,按鈕都沒有反應,原因出到哪里呢?

答:錯誤是出在了第5步,當前狀態(tài)是無法綁定自己的,那么該如何實現(xiàn)這種互斥?

對需要進行控件綁定的狀態(tài):stat1、state2、state3,設置一個父狀態(tài),由父狀態(tài)來分配數(shù)據(jù)綁定就可以實現(xiàn)啦。

修改方案

1:創(chuàng)建父狀態(tài)

QState *stateParent = new QState;

2:每個狀態(tài)設置父狀態(tài)

對state1、state2、state3的構造函數(shù)中,分別繼承自stateParent,修改如下:

QState *state1 = new QState(stateParent);
QState *state2 = new QState(stateParent);
QState *state3 = new QState(stateParent);

3:數(shù)據(jù)綁定修改

由父狀態(tài)進行分配狀態(tài)對應,修改如下:

stateParent->addTransition(ui.btn1, &QPushButton::clicked, state1);
stateParent->addTransition(ui.btn2, &QPushButton::clicked, state2);
stateParent->addTransition(ui.btn3, &QPushButton::clicked, state3);
QFinalState *stateFinal = new QFinalState(stateParent);

并且,初始化父狀態(tài)的初始子狀態(tài)

stateParent->setInitialState(state1);

4:狀態(tài)機數(shù)據(jù)綁定

此時,不需要將state1、state2、state3直接綁定到pMachine中了,而是將stateParent綁定到pMachine中。

并且,設置狀態(tài)機pMachine的初始狀態(tài)是stateParent。

經(jīng)過如此修改后,調試代碼發(fā)現(xiàn),可以實現(xiàn)按鈕的互斥效果了,也就是文章開始的動畫效果。

在不使用狀態(tài)時,使用stateFinal進行銷毀就可以了。比如在響應關閉按鈕時,可以做結束處理

stateParent->addTransition(ui.btnExit, &QPushButton::clicked, stateFinal);

下面貼出完整代碼

今日份分享就到這里了~

到此這篇關于Qt利用QState狀態(tài)機實現(xiàn)控件互斥操作詳解的文章就介紹到這了,更多相關Qt控件互斥操作內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言詳細講解注釋符號的使用

    C語言詳細講解注釋符號的使用

    C語言的注釋符是以“/*”開頭并以“*/”結尾的串。在“/*”和“*/”之間的即為注釋。程序編譯時,不對注釋作任何處理。注釋可出現(xiàn)在程序中的任何位置。注釋用來向用戶提示或解釋程序的意義。在調試程序中對暫不使用的語句也可用注釋符括起來,使翻譯跳過不作處理
    2022-04-04
  • VC MFC非模態(tài)對話框的實現(xiàn)方法

    VC MFC非模態(tài)對話框的實現(xiàn)方法

    這篇文章主要介紹了VC MFC非模態(tài)對話框的實現(xiàn)方法,有助于讀者加深對于模態(tài)對話框與非模態(tài)對話框的理解與運用,需要的朋友可以參考下
    2014-07-07
  • C++中的異常實例詳解

    C++中的異常實例詳解

    異常處理是C++的一項語言機制,用于在程序中處理異常事件,下面這篇文章主要給大家介紹了關于C++中異常的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-02-02
  • C語言中進行函數(shù)指針回調的實現(xiàn)步驟

    C語言中進行函數(shù)指針回調的實現(xiàn)步驟

    在 C 語言中,函數(shù)指針的回調是一種強大的編程技術,它允許我們在特定的事件發(fā)生或特定的條件滿足時,調用由用戶定義的函數(shù),這種機制增加了程序的靈活性和可擴展性,使得代碼更具通用性和可重用性,本文給大家介紹了C語言中進行函數(shù)指針回調的實現(xiàn)步驟,需要的朋友可以參考下
    2024-07-07
  • C語言深入探索遞歸的特點

    C語言深入探索遞歸的特點

    程序調???的編程技巧稱為遞歸 recursion)函數(shù)??調???就是遞歸,你也可以理解成是?種嵌套結構,但遞歸分為倆部分,第?是“遞”,進?嵌套結構。第?是”歸“,最終會?步?步返回。第?次接觸遞歸都會很懵,慢慢理解這個過程就明?了
    2022-06-06
  • C++性能剖析教程之循環(huán)展開

    C++性能剖析教程之循環(huán)展開

    這篇文章主要給大家介紹了關于C++性能剖析教程之循環(huán)展開的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-06-06
  • C語言實現(xiàn)掃雷項目

    C語言實現(xiàn)掃雷項目

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)掃雷項目,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • c語言統(tǒng)計素數(shù)之和的實例

    c語言統(tǒng)計素數(shù)之和的實例

    這篇文章主要介紹了c語言統(tǒng)計素數(shù)之和的實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 基礎C語言編程時易犯錯誤有哪些

    基礎C語言編程時易犯錯誤有哪些

    基礎C語言編程時易犯錯誤有哪些?這篇文章主要介紹了C語言編程時常見的錯誤,感興趣的小伙伴們可以參考一下
    2016-11-11
  • c/c++中struct定義、聲明、對齊方式解析

    c/c++中struct定義、聲明、對齊方式解析

    這篇文章通過C/C++的兩種聲明方式開始,給大家詳細分析了/c+中struct定義、聲明、對齊方式,對此有興趣的朋友可以參考學習下。
    2018-03-03

最新評論