2011-02-01 10 views
2

私は約6ヶ月前にGTKMMアプリケーションを開始しました。それはすべてが機能し、実際に毎日使用しています。基本的に、別のアプリケーションからデータファイルを読み込んでグラフを生成し、データを簡単にソートして表示できるデータベースアプリケーションです。私はそれが好きです。GTKmmアプリケーションのコードを整理する

しかし、私は自分のコードが混乱していると思うし、今日別の機能を実装しようと思ったときに、おそらくどこかに間違った方向転換をしたことに気づいた。

私のメインウィンドウGUIはグレイドファイルで定義されており、GUI(Gtk :: DrawingAreaに基づいたカスタムウィジェットである私のプロットウィジェット以外)はすべて1つのファイルになっています。ウィジェットとツリーストアへのポインタは、すべてコンストラクタでセットアップされ、デストラクタで削除されます。

GUI全体が異なるウィンドウに分割されたメインウィンドウであるため、すべてを1つのファイルに収めるのが理にかなっています。また、別のペインは他のペインと「通信」する必要があります。

メンテナンス可能なようにコードを整理するにはどうすればよいですか?私は本質的にウィジェットのコレクションである新しいクラスを作成し、そのメインウィンドウにスーパーウィジェットを配置しますか(各ウィンドウはスーパーウィジェットです)?

GTKMMのチュートリアルは、一般的には非常に最小限ですので、私はそこで多くの洞察を得ることができませんでした。

答えて

3

私は現在、大きなGTKMMアプリケーションで動作しています。コードベース全体で行われる一般的なルールは、各フレーム(ウィジェットのコレクションを含む)が独自のcppファイル内の独自のクラスであることです。これらのクラスはmain関数で、それぞれがgetFrameメソッドを公開するシングルトンクラスとしてインスタンス化されます。

// Single instance of this class. 
SomeGUIComponent* SomeGUIComponent::m_instance = NULL; 

SomeGUIComponent& SomeGUIComponent::getInstance() 
{ 
    if (m_instance == NULL) 
    { 
    m_instance = new SomeGUIComponent(); 
    } 
    return *m_instance; 
} 

Gtk::Frame& SomeGUIComponent::getFrame() 
{ 
    return m_myMasterFrame; 
} 

はこれが持つ大規模アプリケーションに追加することができます。

SomeGUIComponent::getInstance().getFrame() 
+0

わかりました。さて、フレームがお互いに話す必要があるのはどうですか?たとえば、SomeGUIComponentAのボタンを押して、SomeGUIComponentBのラベルをリフレッシュする必要がありますか?ボタンとラベルの両方が私の巨大なGUIクラスに入っているので、それは簡単ですが、各フレームは1フレームおきにポイントを持つ必要がありますか? –

+0

@baubieこの場合、私たちはパブリックメソッドをコンポーネントBに公開し、プライベートラベルとComponentAの呼び出しを更新します。SomeGUIComponentB.getInstance()。updateLabel(valueToUpdateWith); – Mark

+0

ありがとうございます。私は質問を掲示して以来、これについて多くの読書をしてきました。あなたの答えは確かに有効ですので、私はそのようにマークしました。欠点は、シングルトンがグローバル変数と同じ理由で非常に落胆しているように見えることだけです。代わりに、私は、親ウィンドウへのポインタを各コンポーネントに渡し、親を通してコンポーネントを呼び出すかもしれないと思います。 –

3

私がやってしまったソリューションは、独自のクラスにウィジェットの各論理コレクションを分離することでした。次に、私はマスターのGUIクラスで捕らえられ、そこで処理されたシグナルを作成します。渡されなければならないものはすべて、マスターのGUIクラス・コードで実行されますが、今は物事が意味を成しています。たとえば、フィルタフレームで変更された特定のコンボボックスの値は気にしません。代わりに、フィルターが変更されたときに興味があります。だから私のフィルタクラス(すべてのフィルタウィジェットを含む)はカスタムのchanged()シグナルをスローし、ウィジェットを適切に更新するそのフィルタの変数にsetterとgetterを持っています。

私はこの方法が非常にきれいで、シングルトンを回避し、私のUIを区画化し、全体的に作業するのがより良くなると思います。

関連する問題