2

私の目標は、データベースへのシッククライアントを作成することです。基本的には、3つのデータリストを管理することがすべてです。

アプリケーションを分離されたレイヤーにスライスしたいので、QtのModel/Viewフレームワークを使用するのは自然なことのようです。

  • QSql * Modelインスタンスはいつ作成する必要がありますか?

データベースに何度か接続/切断できる必要があります(そのためのメニュー項目があります)。たくさんのモデルを削除して、接続/切断するたびにもう一度作成することに満足していません。

別のアプローチはありますか?

  • QSql * Modelインスタンスはどこに作成すればよいですか?

MainWindowやその他のGUI関連のクラスが次のようなコードを保持することは想定されていないと思います。

m_goodsModel->setRelation(1, QSqlRelation("Level", "LevelId", "Name"));

GUIをデータ構造から切り離したい。それを行う方法はありますか?

  • いつ、どこでビューをモデルにバインドする必要がありますか?

私は自分の3つのリストを12の方法で表現する必要があります。接続/切断するたびにモデルを再作成する場合は、新しく作成したモデルをすべてのビューに再度挿入する必要があります。

それが一度だけできたらいいのですが、どうしたらいいのかわかりません。

  • 厄介なQSqlTableModel::select()方法をどうするか?

これは私を夢中にさせます。QStringListModelデータをすぐに使用できる他のモデル(たとえば、など)とは対照的にQFileSystemModel、から派生したモデルは、QSqlTableModel手動でメソッドを呼び出すまで役に立ちませんselect()。その呼び出しの前は、モデルは空であるため、そのモデルを使用するビューは空です。ヘッダーデータにもデータが入力されていないため、ビューはどの列をレンダリングする必要があるかさえわかりません。

呼び出しを避けselect()られないので、うまく収まるようにどこに置くべきか疑問に思います。MainWindowやその他のGUI関連のクラスにそのコードを含めるべきではないと思います。

  • パフォーマンスと堅牢性

dbの再接続時にすべてを再初期化するのはうれしいことではありません。それを行うには時間がかかりすぎます(つまり、実行中)。また、ビューが引き続きモデルを参照している可能性があるため、モデルの再作成プロセス中にクラッシュが発生しないようにしたいと思います。

すべてを一度だけ設定し、再接続を適切に処理する他の方法はありませんか?

4

1 に答える 1

1

これらすべての質問に対する簡単な答えは、データベース関連のすべてのアクションを専用のクラスにラップし、MainWindow / Dialog/whateverでこのクラスのインスタンスへのポインターを保持することだと思います。

考えられる設計は次のようになります。

class DatabaseAccess : public QObject
{
       Q_OBJECT
    public:
       void connectToDatabase(const QString & hostname, const QString & db, const QString & user, const QString & password);
       void disconnectFromDatabse();

       QAbstractItemModel * getModelForX();
       QAbstractItemModel * getModelForY();

    private:
       QSqlTableModel * modelForX;
       QSqlRelationalTableModel * modelForY;
}

ここで、XとYは、アプリケーションにあるクエリの種類の単なるプレースホルダーです。

getModelForX / Yメソッドで新しいデータが必要な場合は、でモデルを作成してconnectToDatabase()呼び出すことができます。select()

私の知る限り、データベース接続が異なる同じモデルインスタンスを使い続けることはできません。これはQSqlTableModel、その子孫がインスタンスにバインドされているためQSqlDatabaseです。接続に成功したら、ビューを更新する必要があります。

于 2010-08-19T20:32:13.880 に答える