1

解決方法がわからない設計上の問題があるプロジェクトに取り組んでいます。コードの拡張性のための最良の解決策を見つけたいと思います。プロジェクトはタブ付きの Web ブラウザーで構成されていますが、タブには Web ページだけでなく、他の種類のウィジェットを含めることができます。私は Qt を使用しているため、タブ内のウィジェットは QWidgets (QWebview や、自分でコーディングする必要があるその他のタイプ) です。とにかく、私はこの質問を十分に一般的なものにしようとします。

QWebView と MyWidget の 2 つのクラスが継承するクラス QWidget があります。QWidget を含めることができるため、両方を含めることができるコンテナー (QTabWidget) があります。さらに、QWebView という 1 種類の QWidget にのみ適用されるボタン (たとえば、前のページ ボタン) があります。したがって、このボタンを押すと、QTabWidget に現在の QWidget を要求し、それが QWebView である場合は何かを行い、それ以外の場合は何もしません。それが問題です: 2 つの異なるタイプを区別できるようにする必要があります: QTabWidget に currentWidget を渡すように要求すると、QWidget* が返されますが、それが QWwbView なのか MyWidget なのかわかりません。したがって、実際の型を確認するには、厄介な dynamic_cast<> を実行する必要があります。つまり、別のアクションで新しい MyWidget2 を追加すると、

コマンドパターンとスターテジーパターンを考えているのですが、うまく当てはまらないと思います。

何かアドバイスはありますか?ありがとう

4

1 に答える 1

1

抽象的なレベルでは、さまざまなウィジェット タイプをアクション (たとえば、「前のページに移動」など) にマッピングして、それらがサポートできる方法が必要なようです。そのようにして、新しいウィジェット タイプを追加するときに、そのアクションを指定します。同じように。現在表示されているタブに応じて、関連するアクションを有効/無効にすることができます。これにより、ユーザーがアクションを実行できるときに、現在表示されているタブのタイプで動作することがわかります。

これを行う 1 つの方法は、関連するアクションを返す仮想メンバー関数をベース ウィジェット タイプに追加することです。QWidget次に、タブ ウィジェットによって返された をベース ウィジェット タイプにキャストします。これにはまだキャストが含まれQTabWidgetますが (ベース ウィジェット タイプのウィジェットを返すように調整されていないため)、新しいタイプのウィジェットを追加すると、保守性の問題が解消されます。

于 2013-10-30T18:17:52.340 に答える