3

私は現在、PyGTK から PySide に小さなアプリケーションを移植しています。これはシステム トレイにあり、定期的にサーバーの更新をチェックします。

これを最初に書いたとき、カスタム状態モデルを使用してその動作を表現しました。

アプリケーション状態モデル

  • init: 初期状態
  • check: サーバーの更新を確認します
  • disconnected: サーバーに接続されていません (しばらく待ってから再試行してください)
  • エラー: サーバーがエラーを報告しました (ユーザーは続行する前に設定を確認する必要があります)
  • アイドル: POLLING INTERVAL 秒待機してから、再度チェックします
  • 終了する

その後、Qt には QStateMachine があり、このタイプの構造に最適と思われることを発見しました。しかし、私の問題に満足のいく例を適用することができませんでした!

特に:

  1. QStateMachine のコンテキストでは、Signal と QEvent の違いは何ですか?
  2. 条件付き遷移を定義するにはどうすればよいですか。つまり、エラーが発生した場合に ... に移動しますか?
  3. プログラム ロジックは Transition.onTransition() または QState.onEnter() で発生する必要がありますか?

どんなポインタでも大歓迎です!

4

1 に答える 1

4

Ok。Pyside.QtCore.SignalSignals & Slots の派生物です。

ご質問は

  1. QStateMachine のコンテキストでも違いはないと思いますQEvent(ただし、Signals & Slots はまったく異なる概念です)。必要に応じて、またはでトランジションをトリガーできます。すぐに使用できるトランジションのリストについては、次を参照してください。SignalQEventQEventSignalQAbstactTransition

    継承元: QSignalTransition、QEventTransition、QMouseEventTransition、QKeyEventTransition

  2. 繰り返しますが、アプリケーション内で何が起こるかに応じて、エラーは signal from であるか、QObjectcustom を送信 (投稿) できますQEvent。イベントでのみトランジションをトリガーするには、カスタムQEventおよび/またはカスタムを実装する必要がありますQEventTransition

  3. そしてまた状況によります:) トランジションは接着剤です。発信元と宛先の状態に関する知識があります。したがって、準備コードのみを内部に配置onTransition()し、状態の初期化コードを内部に配置しonEnter()ます。onTransition()また、あなたが示した例のように状態を変更するコードを内部に入れるのは間違っているようです:

    def onTransition(self, e):
        x = e.arguments()[0]
        fac = self.fact.fac
        self.fact.fac = x * fac
        self.fact.x = x - 1
    

    しかし、ご覧のとおり、うまく機能します。

注: iOS の経験がある場合UIStoryboardSegueは、移行はアナログです。主に、UI 状態間UIViewでデータを渡すために使用されます。

于 2013-11-09T21:04:09.947 に答える