問題タブ [qstatemachine]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
212 参照

c++ - RestoreProperty を使用した QStateMachine は、遷移時にプロパティを失います

ステート マシンの Qt ドキュメントには、私が使用している 2 つの原則が示されています: Restoring PropertiesTargetless transitionsです。1 つ目は QState にプロパティを割り当てることができ、2 つ目は特定の状態でのみイベントをトリガーすることができます。

両方の機能を組み合わせると、プロパティの復元が機能しなくなります。がQSignalTransition起動されると、現在の状態が残っていなくても、プロパティは初期値 (ステート マシンが開始される前) に設定されます。

これを再現するための短い例があります:

2 つのボタンがあります。ステート ボタンは S1 と S2 の間でトグルし、トリガー ボタンは S1 がアクティブなときに QSignalTransition をトリガーします。S1 がアクティブなときにトリガーをクリックすると、ボタンのテキストが に戻ります"Not set"。の概念をsetGlobalRestorePolicy()正しく理解していれば"S1"、状態 S1 の値であるため、プロパティはそのままである必要があり、状態は残っておらず、まだアクティブです。

見逃したり誤解したりしたことはありますか、それとも何か間違っていましたか?

これが違いを生む場合、私はWindowsでQt 4.8.4を使用しています。

0 投票する
0 に答える
1755 参照

qt - Qt の QStateMachine でイベント遷移とガード条件を実装する

QStateMachine の使用法、特に遷移をトリガーするユーザー イベントの処理を理解しようとしています。さらに、ガードを実装する最良の方法を理解したいと思っています。以下にステートマシンを描きました。これはほとんどシーケンシャルであり、ステート マシンの良い例ではありませんが、QProcess 呼び出しの結果を待っている間に遅延があるため、ブロックしないという目的には役立ちます。これらの遅延は、代わりにタイムアウト イベントとして非同期に処理されます。

ステート マシンは、起動時に rndis 接続がないと想定し、定期的に長い一連のイベントを実行して接続を確認します。接続が検出されると、短いチェックが定期的に実行され、まだ接続されていることを確認し、そうでない場合は長いチェックの実行に戻ります。

これは不完全な基本的なセットアップ コードです。

このコードが存在する Detector オブジェクトで startTimer を呼び出すことができます。次に、Detector::timerEvent で、ユーザー定義の「タイムアウト」イベントをステート マシンにポストできます。また、トランジションごとに新しいタイマーを開始する必要があります。各トランジションのアクションは、QEventTransition のサブクラス、おそらく「onTransition」メソッドで発生します。これらの (一意の) 遷移オブジェクトのそれぞれに Detector オブジェクトを渡して、Detector が startTimer() を呼び出すようにするにはどうすればよいですか? また、2 つのトランジションにガード条件を実装する方法がわかりません。QAbstractTransition に仮想の「eventTest」が表示されますが、それを使用してガードを実装する方法がよくわかりません。私の考えはまだQtのやり方ではないと確信しています。

Qt に関する 2 冊の本 (Summerfield と Ezust から) と、http://doc.qt.io/qt-5/statemachine-api.html#events-transitions-and- も参照しました。警備員。本は QStateMachine についてまったく言及していません。Qt のオンライン ドキュメントには、汎用ステート マシンのサンプル コードが十分にないように思えます。既存の信号を使用してトランジションを作成する方法をうまく示していますが、ユーザー定義のイベントは示していません。

どんな助けでも大歓迎です。ありがとう。

シンプルな検出ステート マシン

編集: Detector::timerEvent() 関数の基本的な switch ステートメントを使用して、独自の単純なステート マシンを実装できることがわかりました。私は今これを行っていますが、QStateMachine を使用してこれを行う方法を理解すること に非常に興味があります。

0 投票する
2 に答える
3516 参照

c++ - QStateMachine での遷移が成功した場合、クラスからシグナルを発行する

私の問題は次のとおりです。QStateMachine インスタンスを含むクラスを作成する必要があります。このクラスには、ステート マシンに別のステートへの遷移を「要求」できるスロットが必要です。そして、移行が成功した場合、私のクラスはそれについてのシグナルを発するはずです。これをどのように実装しますか?クラスは、特定のスロット呼び出しに従って特定のシグナルを発信する機能を備えている必要があります。クラスの小さな例を次に示します。

私はあなたの助けにとても感謝しています!

UPD:
スロットはさまざまな種類の遷移を表しているため、外部クラス (を使用するMyClass) は何らかの遷移を「要求」できます。そのため、スロットはイベントまたは信号をステート マシンに送信し、イベントまたは信号を調べて (正しい状態にある場合)、この遷移を行います。そして、スロット(遷移)が成功する前に、特定のシグナルで外部クラスに通知したいと思います。

0 投票する
1 に答える
319 参照

c++ - サーバーからの応答を待っている間に Qt クライアント アプリケーションが停止する

問題 :
While ループを使用して状態をチェックし、指定された時間内にサーバーから応答が得られない場合はタイマーを使用します。

OS: Linux
SDK: QT 5.5

説明:

私はクライアント側を実装しましたが、コードには、何らかの条件(「チェックマシンが開始されました」)が真であることを継続的にチェックするwhileループがあります。この状態は、マシン Server から何らかのメッセージを受け取ると変化します。whileループを実装すると、スタックして出てこない。このフォーラムで質問を投げかけたところ、親切にも私の間違いを指摘してくれた人がいて、while ループがすべてのリソースを消費しているため、QStateMachine を使用するよう提案してくれました。

そのため、ステート マシンについて詳しく調べているときに、QCoreApplication::processEvents() に出くわしました。コードに追加すると、すべてが期待どおりに機能しますが、タイマー部分はまだタイムアウトします。今私の質問は

1) QStateMachine と QCoreApplication::processEvents() の違いは何ですか & どちらが優れていますか?

2) QTimer を正しく使用して、while ループの条件が規定時間内に真にならない場合、タイムアウトして while ループをスキップする方法。

0 投票する
2 に答える
371 参照

c++ - QStateMachine - QMouseEvent

別の質問では、QStateMachine を使用するように言われました。

私はQtを初めて使用し、オブジェクトを使用するのは初めてなので、多くの論理的な間違いを犯すため、QStateMachineを使用すると大きな問題になります...

それを行う唯一の方法ですか?私は自分のプログラムを説明しようとしています:

カードのゲームを作成したいのですが、以前のバージョンでは、次の一連のコマンドで古いグラフィック ライブラリを使用していました。

このようにして、プログラムに次のように伝えます。

プログラムのグラフィックを変更したいので、QGraphics を導入しました。シーンを作成し、その上にすべてのオブジェクト「カード」を印刷したので、プログラムに伝えたい:

問題は、for1 ~ 20 を使用することです (試合で 20 回実行する必要があります)。ランダムな G1 および COM プレイでプログラムを起動しようとしましたが、最後の実行までアプリケーションがフリーズしfor、カードの最後の構成のみをシーンに出力します。それが理由です。以前、プログラムを停止したいと言ったからです...

QStateMachine なしで行うことは可能ですか? 彼に「一時停止」、この状況を印刷、マウスを待ってから先に進む、と言うだけです。

0 投票する
1 に答える
263 参照

c++ - QStateMachine の仕組み

4 つの異なる QState を作成しましたが、すべての状態遷移で 1 つのオブジェクトを非表示にしたいと考えています。

これはコードです:

presastatobool、プログラムの次のステップで変更する 2 つです。

これQGraphicsSceneで、シーンに と が追加されましたQGraphicsPixmapItem

たとえば、アイテムを隠しているシーンを更新したい:

QState を (この場合は からinizio_manoaspetto_G1_primo) 変更する必要があることを理解しており、トランジションを追加しました。

しかし、どうすればそのアイテムを非表示にできますか?

QStateaspetto_G1_primoをどのように接続できますかobject1 -> hide();

正しく説明したことを願っています。

私の主な問題は、各 QState にシーンの異なる構成を割り当てるにはどうすればよいですか?