私はここに登録したばかりなので、何かの前に読んでくれてありがとう!プライベートメンバーを使用する異なるクラスの同じメソッドをマージする方法
私は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クラスでシグナルを使用してメンバーを直接管理することはできますが、コードを大量に作成する必要があり、コードが変更されると複雑になります。これが主な理由です。クラス。
私の質問は、メンバーを共有したり、グローバル変数を使用することなく(同じ効果があるため)、これらのメソッドを「統一する」方法はありますか?これらのメソッドを別々のファイルに入れたいと思います。
ありがとうございました!
ライブラリアプリケーション(dllまたはlib)を作成するのに最適な時間のように聞こえる、共通のインターフェイスを共有できる複数のアプリケーションによって使用されるロジックが類似している場合は、アプリケーションが何らかのAPIを使用してすべて使用できます。 – AJG85
@ AJG85あなたの答えをありがとう!たぶんいいアイデアかもしれませんが、私は同じ問題を抱えています:UIメンバーを共有せずに変更することです。私は、 "Cleaner"ソリューションはMainWindowクラス(UIを制御するクラス)でこれを行うと思いますが、私は同じコードを繰り返したくはありません。 ありがとう! –
モデル/ビューアーキテクチャはQtでうまくいきます。一般的に、あなたのGUIがあなたのデータに結合されていないと、変更を加える方が簡単です。 – AJG85