1

GUI を作成する必要はあまりありませんが、今日は作成しているので、デザインの入力を期待していました。

基本的に、MVC パターンを使用して GUI も追加する予定のバックエンドがあります。問題は、メイン GUI ウィンドウをカプセル化するクラスが何であれ、多くの状態 (すべてのサブ要素) を持つことになると感じていることです。それに加えて、多くのセッターがあり、おそらくゲッター、クリア、カラー、サイズ、位置、およびリフレッシュ機能もあります。

  • 1 つのオプションは、このアイデアを進めて、GUI が使用する型 ( std::stringstd::vector<std::string>...) を処理する非常に大きなパブリック インターフェイスを用意することです。UI をより細かく制御したいほど、より多くのパブリック メンバー関数が必要になります。

  • もう 1 つのオプションは、プログラムの状態を GUI に渡し、それをどのように表示するかを決定させることです。これを行うと、詳細な制御が少なくなり、懸念事項の分離が崩壊し、プログラムの状態を表現するには、GUI も変更する必要があります。

この問題に関する意見は非常に役立ちます。

違いがある場合、これは ncurses 抽象化を使用した C++ GUI です。

4

3 に答える 3

2

M と V についてはよく考えたように思えますが、C についてはあまり考えていないようです。全体的な考え方は、コントローラーがモデル (データ) とビューの間の橋渡しであるということなので、パターンは実際には MCV と呼ばれる必要があります。 (GUI)。あなたが言及したほとんどの機能を備えたコントローラーが必要なようです。

簡単に言えば、モデルは明らかにディスプレイについて何も知らず、ディスプレイ (ビュー) はモデルへのアクセス方法を認識すべきではありません。データ (モデル) を読み取り、ディスプレイ (ビュー) に指示を与えるコントローラーが必要です。ビュー内でユーザーの操作がある場合、コントローラーはそれを解釈し、必要に応じてモデルを変更できます。

3 つすべてを変更する必要はありませんが、モデルまたはビューを変更すると、ほとんどの場合、コントローラーを更新する必要があります。

それが役立つことを願っています...

于 2013-03-01T20:36:58.260 に答える
0

巨大なインターフェースに代わるものが少なくとも1つあります。それぞれ(サイズ、フォント、色、表示するものなど)を処理する関数を使用する代わりに、「役割」とその役割を表すデータを受け入れる単一の関数を使用します。これには、複数のデータ型を含むことができるある種のラッパーが必要です。

QTのQAbstractItemModelクラスリファレンスには良い例があります。

QVariant QAbstractItemModel :: data(const QModelIndex&index、int role = Qt :: DisplayRole)const [pure virtual]

その関数が行うことは、提供されたインデックスで示された役割を表すQVariantを返すことです。

このアプローチの欠点は、どのような役割が存在し、それらが何をするのかを知る必要があることです。 QTのデフォルトの役割がここに表示されます。

于 2013-03-01T20:54:06.993 に答える
0

モデルの一部を自分自身で計測できるようにしたい:

class Model {
private:
    int value;
public:
    void instrument(Instrumenter& instrumenter);
};

Instrumenter、コントロールの作成を管理します。モデルは、どのように制御できるかを伝え、データへのアクセスを許可します。

void Model::instrument(Instrumenter& instrumenter) {
    instrumenter.addRangeController(0, 100, 5, value);
}

次に、さまざまな入力デバイス (キーボード、タッチスクリーンなど) に対して、適切なコントロールを作成できます。

class KeyboardInstrumenter : public Instrumenter {
public:
    void addRangeController(int min, int max, int increments, int& controlled) {
        // create 3 widgets, up arrow, down arrow, and value
    }
};

class TouchscreenInstrumenter : public Instrumenter {
public:
    void addRangeController(int min, int max, int increments, int& controlled) {
        // create slider with min, max and increments
    }
};

を直接渡す代わりに、intカプセル化を支援するために制御オブジェクトでラップすることもできます。

于 2013-03-01T21:53:25.560 に答える