私は主に .Net 開発者で、しばらく Qt を調査しています。私は現在、モデル/ビュー フレームワークを Qt に実装しようとしている段階です。私は基本的な原則を把握していると思いますが、ウィジェットが相互に通信する必要があるより複雑な UI で物事をまとめる方法が不明です。以下を考えると:
// 'domain' model classes
class NestedDomainModel1
{
public:
NestedDomainModel1();
QString name() const;
void setName(const QString& newName);
// other properties
private:
QString m_name;
};
class NestedDomainModel2
{
public:
NestedDomainModel2();
QString name() const;
void setName(const QString& newName);
// other properties
};
class MyDomainModel
{
public:
MyDomainModel();
void addNestedModel1(const NestedDomainModel1& modelToAdd);
NestedDomainModel& nestedObjectModel1At(int index);
int nestedObjectModel1Count() const;
// repeat for model 2
private:
QList<NestedDomainModel1> m_nestedModels1;
QList<NestedDomainModel2> m_nestedModels2;
};
// 'GUI' classes
class MainWindow : public QMainWindow
{
private:
MyDomainModel* m_model;
MyTreeViewWidget* m_treeWidget; // -> this sits in a left dock window
MyInfoDisplayWidget* m_infoWidget; // -> this sits in a right dock window and display details about the item selected in the tree
};
class MyDomainModelTreeModel : public QAbstractItemModel
{
public:
explicit MyDomainModelTreeModel(MyDomainModel* model);
// required overrides for QAbstractItemModel
private:
MyDomainModel* m_model;
};
class MyTreeViewWidget : public QWidget
{
public:
// Take a pointer to the domain model and create a model for the 'view'.
// Will create a tree like:
// Nested Objects 1
// |- object 001
// |- object 002
// |- you get the idea
// Nested Objects 2
// |- other object 001
// |- more of the same
explicit MyTreeViewWidget(MyDomainModel* model);
public slots:
// Used to notify widget when an item is added to the underlying model.
void nestedModel1Added();
void nestedModel2Added();
signals:
void nestedModel1Selected(NestedDomainModel1& selectedModel);
void nestedModel2Selected(NestedDomainModel2& selectedModel);
private slots:
// connect to tree view event when an item is selected and if all ok, emit one of the selected events
void onTreeItemSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
private:
QTreeView* m_treeView;
MyDomainModelTreeModel* m_treeModel;
};
class MyNestedClass1ViewModel : QAbstractItemModel
{
public:
explicit MyNestedClass1ViewModel(NestedDomainModel1* model);
setModel(NestedDomainModel1* model);
// required overrides for QAbstractItemModel
private:
NestedDomainModel1* m_model
};
class MyInfoDisplayWidget : public QWidget
{
public:
explicit MyInfoDisplayWidget(QWidget* parent = 0);
public slots:
// this is connected to the 'tree' widget signal in MainWindow
void setModel(NestedDomainModel1& selectedModel);
};
UI の基本的な前提は、Visual Studio に似た感覚です。ツリーはソリューション エクスプローラーに似ており、「情報表示」はプロパティ ウィンドウに似ています。
これがモデル/ビュー フレームワークの使い方ですか? WPF/Silverlight 開発に精通している人にとって、モデル/ビュー フレームワークは、「ビューのモデル」であり、ドメイン モデルをラップ/含むという点で (高レベルで) MVVM に似ていますか?
これは、モデル/ビュー フレームワークを使用してウィジェットを接続する方法ですか (つまり、あるウィジェットがモデルのポインターまたは参照を別のウィジェットに渡します)。または、SelectionModel を使用する必要がありますか? ツリー モデルにはさまざまな種類のオブジェクトが含まれているため、それは機能しますか?
ルートノードをどのように識別しますか? たとえば、MyNestedObject1 が作成され、ツリーに追加する必要がある場合、ルート ノードがモデル インデックス QModelIndex(0, 0) (つまり、無効な親インデックスを持つ行 0) にあるという知識に依存しますか?