1

私は主に Python/Django 開発者なので、用語が少しずれている可能性があるため、この質問に対する答えが見つかりません。

C++/Qt でカスタム モデル ロジックを定義する方法/場所は?

Users列を持つテーブルがあり、ユーザーの年齢を単純に計算date_birthするメソッドを追加したいとしましょう。getAge()

これをどこに置くのですか?QSqlRecord のサブクラスを作成することは適切に思えますが、このアプローチへの参照は見つかりませんでした。

2 番目: QSql(Relational)?TableModel をサブクラス化するための規則はありますか?

多くの例で同様のスニペットを見つけました。

QSqlTableModel *model = new QSqlTableModel(parentObject, database);
model->setTable("employee");
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select();
model->setHeaderData(0, Qt::Horizontal, tr("Name"));
model->setHeaderData(1, Qt::Horizontal, tr("Salary"));

しかし、必要な場所で定義するのは冗長に思えます。UserTableModel などのサブクラスを作成し、そのコンストラクターでこれらすべてのメソッドを呼び出すのは一般的ですか? 繰り返しますが、私はそれへの参照を見つけていません。

4

3 に答える 3

1

あなたが達成しようとしているのは、オブジェクト/リレーショナル マッピングです。

ですから、オブジェクトをどの SQL クラスからも継承させない方がよいでしょう (どのオブジェクト言語でも)。

2 つのクラスを作成できます。1 つは「従業員」用で、もう 1 つは SQL オブジェクトを処理してこのオブジェクトを作成するファクトリ オブジェクトです。

ObjectsFactory *factory = new ObjectsFactory();
Employee e = factory->getEmployee(2423);
int age = e->getAge();

この種のソリューションでは、Employee クラスは SQL クラスに依存しません。ストレージ モデルに応じてハンドラーを作成することもできます。

ObjectFactory *factory = new ObjectsFactory(new SQLHandler);

または(テストに便利)

ObjectFactory *factory = new ObjectsFactory(new FileHandler);

ObjectFactory *factory = new ObjectsFactory(new MemoryHandler);

Data Access Object patternをご覧になることをお勧めします

于 2012-12-18T10:38:27.863 に答える
0

継承の代わりにプロキシ モデルを使用してロジックをデータ ソースから分離する別のアプローチを提供できますか。

その方法は、データの定義方法のレイアウトの変更に対して、より柔軟で堅牢に見えます。非常に柔軟な方法でモデルを使用する方法について、より良いヒントを提供できる記事のセットがいくつかあります。

http://lynxline.com/category/models/

于 2014-01-19T13:41:59.003 に答える
0

Qt で独自のモデルを作成するには、次のことを行う必要があり
ます。 1. QSqlTableModel を継承するクラスを作成します
。 2. 必要に応じて実装します。

QVariant data( const QModelIndex& index, int role = Qt::DisplayRole ) const;
int rowCount( const QModelIndex& parent = QModelIndex() ) const;

3. 必要なメソッドを追加します。ここで
見つけることができる詳細情報

于 2012-12-18T11:17:48.570 に答える