Qtを使用して、いくつかのQPushButtonボタンを持つQStackedWidgetがあります。ウィジェットの親ウィジェットは QMainWindow です。QStackedWidget 内には、QLineEdit もあります。私がやりたいことは簡単です: テキストボックスを含むフォームを検証し、それがすべて問題ない場合は、データを処理するカスタム クラスの関数を呼び出します。クラスのインスタンスは、QMainWindow クラス内に作成されます。そのクラスのメソッドを呼び出す最良の方法は何でしょうか? カスタム クラスを QStackedWidget 内のウィジェットのインスタンスに接続する Qt のシグナル/スロット メカニズムを使用する必要がありますか?
1 に答える
必要に応じて何度でもQValidatorから派生させ、検証が必要な各フィールドにバリデーターをインストールできます。このようにして、フィールドが空であるか、有効なエントリが含まれていることが保証されます。
データを処理する前に、該当するすべてのフィールドにデータがあることを確認してください。そうすれば、フォームが有効であることが保証されます。
フォームからフォーム データの一部のコンシューマにデータを渡す一般的な方法は、データを保持する仲介者クラスを作成することです。フォームが検証された後、クラスのインスタンスが設定され、そのインスタンスがコンシューマーに渡されます。このようにして、フォームに変更があった場合、同じデータが収集されていれば、コンシューマーはこれらの変更から隔離されます。
一般的なルールは、実装ではなく、オブジェクト インターフェイスに対して作業することです。いくつかのことを念頭に置いている限り、sig/slot または直接関数呼び出しを行うかどうかは問題ではありません。
Sig/slot は呼び出し順序を保証するものではありません。信号を発信するということは、本質的に、このオブジェクトを見ることができる人なら誰でもその信号に接続して、この変更を取得できることを意味します。サブコンポーネントによるフォーム データの処理順序を保証する必要がある場合、メンテナンス プログラマーに混乱させるオプションを与える必要があるでしょうか。
第 2 に、オブジェクトがどこにあるかは重要ではありません。ある日、データ コンシューマーが非常に複雑になり、いくつかのシナリオ (ユーザーの特権、今日の日付、または現在の気温など、私にはわかりません!) に基づいて別のコンシューマーをスナップしたい場合は、次のようにします。再アーチしたい。コンシューマーにデータを取得するためのロジックが、フォーム内の特定の方法で存在するオブジェクトに大きく依存している場合、それは間違っています。