質問

wx(およびwxPython)には、PyQtで見逃す2つのイベントがあります:

    フレームに送信される
  • EVT_IDLE 。アプリケーションの状態に応じてさまざまなウィジェットを更新するために使用できます
  • EVT_UPDATE_UI を再描画および更新する必要があるときにウィジェットに送信されるため、ハンドラーでその状態を計算できます

現在、PyQtにはこれらの機能がないようです。PyQtの本では、 updateUi メソッドを記述して手動で呼び出すことを推奨しています。 GUIを更新する可能性のあるメソッドからの多くの手動呼び出しを回避するために、0.1秒に1回、タイマーから呼び出すことさえしました。何か不足していますか?これを達成するためのより良い方法はありますか?


例:処理を開始する[スタート]ボタンを備えたシンプルなアプリがあります。スタートボタンは、メニューを使用してファイルを開いたときにのみ有効にする必要があります。さらに、ステータスバーに情報を表示する永続的なウィジェットがあります。

私のアプリケーションには次の状態があります:

  1. ファイルを開く前(この状態では、ステータスバーには特別なものが表示され、スタートボタンは無効になっています)
  2. ファイルが開かれ、処理が開始されていません。開始ボタンが有効になっており、ステータスバーに何か表示されます
  3. 処理が実行中:開始ボタンに「停止」と表示され、ステータスバーに進捗状況が報告されます

Wxでは、ボタンの更新UIイベントでその状態を処理します。アプリケーションの状態に応じて、その上のテキストと、それが有効かどうかを処理します。ステータスバーについても同じです(または、そのためにEVT_IDLEを使用します)。

Qtでは、状態に影響する可能性のあるいくつかのメソッドでボタンを更新するか、update_uiメソッドを作成してタイマーで定期的に呼び出す必要があります。もっと「QT」っぽい方法は何ですか?

役に立ちましたか?

解決

wxWidgetsでのEVT_UPDATE_UIの使用は、wxWidgetsとQtが開発者がコード内のイベントを処理することを期待する方法の根本的な違いの1つを強調しているようです。

Qtでは、ユーザーインターフェースのウィジェット間でシグナルとスロットを接続し、「ビジネスロジック」を処理します。各スロットで、または専用の方法に委任します。通常、再描画要求はイベントキューに配置され、制御がイベントループに戻ったときに配信されるため、GUIの各ウィジェットを個別に変更する必要はありません。一部のペイントイベントは、効率化のためにマージされることもあります。

したがって、状態の変更を処理するために信号とスロットが使用される通常のQtアプリケーションでは、アプリケーションの状態を監視し、ウィジェットを更新するアイドルメカニズムは基本的に必要ありません。 >

Qtでこのイベントと同等のイベントが必要な理由を説明するには、あなたが何をしているのかについてもう少し言わなければなりません。

他のヒント

状態の変更を示すQt信号を送信します(fileOpened、processingStarted、processingDoneなど)。開始ボタンとステータスバーウィジェット(またはサブクラス)を管理するオブジェクトのスロットは、「ポーリング」ではなく、これらの信号に接続できます。アイドルイベントの現在の状態。

シグナルをすぐにではなくイベントループの後半で遅延させる場合(たとえば、何かを行うのに少し時間がかかるため)、「キュー」を使用できます。通常の種類ではなく、信号スロット接続。

http://doc.trolltech.com/4.5/signalsandslots.html#signals

接続タイプは、connect()関数のオプションのパラメーターです。 http://doc.trolltech.com/4.5/qobject.html#connect http://doc.trolltech.com/4.5/qt.html# ConnectionType-enum

私が理解している限り、アプリケーションメッセージキューが空のときにEVT_IDLEが送信されます。 Qtにはそのようなイベントはありませんが、保留中のイベントがないときにQtで何かを実行する必要がある場合は、タイムアウトが0のQTimerを使用する必要があります。

一般に、よりQtらしい方法は、更新が必要な機能で必要に応じてボタン/ツールバーを更新するか、一部の機能を統合し、プログラムが必要なときにその機能を直接呼び出すことです(updateUiなど)関数)。

Qtでは、Ui要素の属性を変更してもすぐに再描画は行われませんが、イベントシステムで再描画をキューに入れ、複数の再描画呼び出しは可能な限り1つに圧縮されることに注意してください。

状態に関する複数の変更については、このブログ投稿は、状態をより簡単に処理するためのQtへの追加が期待されています。複数の関数で状態変数を移行するだけで、UIの他の部分が一致するように更新する必要があるため、これで多くの苦情が処理されるようです。これが次のQtリリースに組み込まれることは肯定的ではありません(私はそれに賭けるか、またはそれに似たものですが)。または、この概念を使用して、必要に応じて状態を追跡する独自のクラスを作成することもできます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top