2011-12-12 24 views
3

私はここに登録したばかりなので、何かの前に読んでくれてありがとう!プライベートメンバーを使用する異なるクラスの同じメソッドをマージする方法

私はQtを使用してアプリケーションを開発していますが、クラスメンバーの共有に関するいくつかのアドバイスが必要です。 私はプロジェクト固有の構造体のいくつかのコレクション(QHash)を扱っています。これらのコレクションを管理するポリモーフィックなクラスを作成しました。

メインクラスの管理コレクションの

class ArmyEditor : public QMainWindow 
{ 
//.... some specific functions ... 

private: 
    Ui::ArmyEditor *ui; 

    // Specific structs 
    QHash<QString, GameCategory> categories; 
    QHash<QString, Column> columns; 
    QHash<QString, GameProperty> properties; 
    QHash<QString, UnitOption> commonOptions; 
    QHash<QString, UnitOption> inheritedOptions; 
    QHash<QString, GameItem> items; 
    QHash<QString, GameItem> inheritedItems; 
    QHash<QString, GlobalText> globalTexts; 
    QHash<QString, GlobalText> inheritedGlobalTexts; 
    QHash<QString, Unit> units; 
}; 

基本クラス..それはこのようなものだ派生クラスはまた、いくつかのUIコンポーネントを管理(ポインタまたは参照を介して共有される)ので、それは自動的にUIでこれらの構造体を表すことができ

class StructEditor : public StructManager 
{ 
    Q_OBJECT 
public: 

    StructEditor(QWidget* parent = 0); 

    // ...Overriden functions to automatically represent structs in the shared members.. 

protected: 
    QTreeWidget *catList; 
    QListWidget *colList; 
    QTreeWidget *propList; 
    QTreeWidget *optList; 
    QListWidget *optActionList; 
    QTreeWidget *itemList; 
    QListWidget *itemActionList; 
    QTableWidget *globalTextsGrid; 
    QTreeWidget *unitTree; 
    QComboBox *optCategory; 
    QComboBox *itemCategory; 
    QComboBox *unitCategory; 
    QComboBox *optAmountColumn; 
    QComboBox *optSetColumn; 
}; 
..に

class StructManager : public QObject { 
    Q_OBJECT 
public: 

    explicit StructManager(QWidget* parent = 0); 

    // ...Functions that perform actions in shared components... 

protected: 
    QWidget *parent; 
    QHash<QString, GameCategory> *categories; 
    QHash<QString, Column> *columns; 
    QHash<QString, GameProperty> *properties; 
    QHash<QString, UnitOption> *commonOptions; 
    QHash<QString, GameItem> *commonItems; 
    QHash<QString, GlobalText> *globalTexts; 
    QHash<QString, Unit> *units; 
}; 

UI管理のための派生クラスなど210

そして私は

ArmyEditor::ArmyEditor(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::ArmyEditor) 
{ 
    ui->setupUi(this); 

    // Setup Army Struct Manager 

    armyManager = new StructEditor(this); 

    armyManager->setCatList(ui->catList); 
    armyManager->setOptList(ui->optList); 
    armyManager->setOptActionList(ui->optActionList); 
    armyManager->setItemList(ui->itemList); 
    armyManager->setItemActionList(ui->itemActionList); 
    armyManager->setGlobalTextsGrid(ui->globalTextsGrid); 
    armyManager->setUnitTree(ui->unitTree); 
    armyManager->setOptCategory(ui->optCategory); 
    armyManager->setItemCategory(ui->itemCategory); 
    armyManager->setUnitCategory(ui->unitCategory); 
    armyManager->setOptAmountColumn(ui->optAmountColumn); 
    armyManager->setOptSetColumn(ui->optSetColumn); 
    armyManager->setCategories(&categories); 
    armyManager->setOptions(&commonOptions); 
    armyManager->setItems(&items); 
    armyManager->setGlobalTexts(&globalTexts); 

    //.. some other code .. 
}; 

...メインウィンドウクラスのコンストラクタで、いくつかのUIのメンバーを共有し、私はそのような新しいカテゴリーや何かを追加する必要があるとき、私はStructEditorクラスから関数を呼び出す.. 私のプロジェクトが構成されてい3つのアプリケーションのうち、これらの構造体を管理するメソッドとほとんど同じメソッドを使用するため、メソッドのクラスを使用して、MainWindowクラスのメンバポインタを共有するUIの構造体を追加、更新、削除、および表現しました。しかし、今私はそれが少し汚れていると思っているので、MainWindowがそれらを制御できなくなるので、これらのメンバーを共有するべきではありません。私は基本クラスで自分の構造体のコレクションを作成し、MainWindowクラスでそれらのコレクションのメンバーを(安全に)読むことができるようにメソッドを作ることができると思っていましたが、私の問題はUIメンバーにあります。 MainWindowクラスでシグナルを使用してメンバーを直接管理することはできますが、コードを大量に作成する必要があり、コードが変更されると複雑になります。これが主な理由です。クラス。

私の質問は、メンバーを共有したり、グローバル変数を使用することなく(同じ効果があるため)、これらのメソッドを「統一する」方法はありますか?これらのメソッドを別々のファイルに入れたいと思います。

ありがとうございました!

+0

ライブラリアプリケーション(dllまたはlib)を作成するのに最適な時間のように聞こえる、共通のインターフェイスを共有できる複数のアプリケーションによって使用されるロジックが類似している場合は、アプリケーションが何らかのAPIを使用してすべて使用できます。 – AJG85

+0

@ AJG85あなたの答えをありがとう!たぶんいいアイデアかもしれませんが、私は同じ問題を抱えています:UIメンバーを共有せずに変更することです。私は、 "Cleaner"ソリューションはMainWindowクラス(UIを制御するクラス)でこれを行うと思いますが、私は同じコードを繰り返したくはありません。 ありがとう! –

+1

モデル/ビューアーキテクチャはQtでうまくいきます。一般的に、あなたのGUIがあなたのデータに結合されていないと、変更を加える方が簡単です。 – AJG85

答えて

0

あなたが提供した継承とあなたのデータが存在する場所を見てください。

AJG85は、例えばので、あなたのマニピュレータとビューからデータを切り離す必要があります指摘したように:

class StructManager { 
private: 
    typedef QHash<QString, GameCategory> CategoryT; 
    CategoryT categories; 
    .... 
public: 
    CategoryT& getCategories() { return categories; } 
}; 

class StructEditor : public QObject 
{ 
Q_OBJECT 
protected: 
    StructManager sm; 
... 
}; 

class ArmyEditor : public StructEditor 
{ 
public: 
    <manipulation methods> 
}; 

class ArmyWindow : public MainWindow 
{ 
private: 
    ArmyEditor ae; 
.... 
}; 

あなたはUIからのすべてのイベントがに渡すことができることがわかります。この構造を踏襲していたら、あなたのデータを操作し、それを読み取るフィールドを表示するエディタです。

この方法では、オブジェクトとコードの重複なしでデータを共有することはできません。あなたが本当に空想になりたい場合は、この操作を行います。

class BaseEditor 
{ 
protected: 
    void ManipulateCategories() = 0; 
}; 

class StructEditor : public QObject, public BaseEditor 
{ 
    .... 
}; 

class ArmyEditor : public QObject, public BaseEditor 
{ 
.... 
}; 

私はあなたが個々のエディタクラスの実装を把握することができます確信しています。

+0

多くの時間を経て、私はUIデカップリングとMVCのようないくつかのデザインパターンの経験を得て、皆さんが本当に意味するものを本当に理解していると言いたいと思います。幸い、実際のデータとUIの間にはいくつかの「レイヤー」が存在するため、私のコードは結合されていないので、間違いを修正するのは簡単です。ありがとう、ありがとうございました –

関連する問題