3

いくつかのデータベース テーブルを参照し、ユーザーがこれらのテーブルを編集できるソフトウェアを作成したいと考えています。このリンクを読んだ後、モデル/ビューは必要なものに適したアプローチだと思いました。次のモックアップを見てください。 ここに画像の説明を入力

これを知っているので、概念を理解していることを確認するために質問があります。私が良い方向にいるかどうか教えてください:

  1. テーブルごとにモデル クラスを作成する必要があると思いますか? (QAbstractModel のサブクラス化)。次のようになります。

    class citiesTableModel : public QAbstractItemModel
     {
         Q_OBJECT
     }
    
  2. cityTableModel コンストラクターはデータベースのテーブルからデータを取得しますか?

    QAbstractItemModel *model = new citiesTableModel(); //model will contain 2 rows, New York and Seattle
    
  3. 異なるモデルごとに QTableView をサブクラス化する必要がありますか?

    class citiesTableView : public QTableView{}
    
  4. 最後に、view.setData と view.setModel を再実装する必要があると思いますか? setModel は各モデル行をループして QTableView を構築し、setData は適切なクエリを実行してモデルに新しいデータを追加しますか?

どうもありがとうございました。

4

2 に答える 2

3

基本的に、さまざまなオプションがあります。

どちらのデータベースも SQL データベースです。サブクラスQSqlTableModelを使用できます。それ以外の場合は、モデルを最初から作成する場合は、独自のモデルを作成しますが、ポイントがわかりません。QTableModelの例もあります。

テーブルは常にテーブルモデルであるため、テーブルごとにモデルを作成する必要はありません。モデルは主に、特定のデータで行を追加および削除する方法を定義します。

ビューに関しては、QTableView を継承して、たとえばドラッグ イベントなどの行と列のカスタム動作を追加する必要があります。

必要なカスタマイズ要素は、ビューまたは列のデリゲートだけです。基本的に、モデルのブール値をチェックボックスに変換します。

精度を高めるには、 SpinBox デリゲートを参照することをお勧めします。

お役に立てれば。

編集:

PostgreSQL の場合、QsqlDatabase に追加できます。

 QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
 db.setHostName("acidalia");
 db.setDatabaseName("customdb");
 db.setUserName("mojito");
 db.setPassword("J0a1m8");
 bool ok = db.open();

次に、db を QSqlTableModel に渡します。外部キーからフィールドをフェッチするなど、より多くのリレーショナル操作が必要な場合は、次を使用できます。

QSqlRelationalTableModel
QSqlRelationalDelegate
于 2013-03-20T13:14:58.060 に答える
1

これに使えますQSqlTableModel

ドキュメントが言うように、それは非常に簡単に使用できます:

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"));

QTableView *view = new QTableView;
view->setModel(model);
view->hideColumn(0); // don't show the ID
view->show();

テーブルごとにモデル クラスを作成する必要があると思いますか?

はい、1 つのモデルは 1 つの SQL テーブルを表します。

cityTableModel コンストラクターはデータベースのテーブルからデータを取得しますか?

QSqlTableModelあなたのためにそれをします:

QSqlTableModel *model = new QSqlTableModel(parentObject, database);
model->setTable("employee");
model->select();

異なるモデルごとに QTableView をサブクラス化する必要がありますか?

いいえ、あなたはしません。で設定した任意の機種を1台QTableviewで表示できますsetModel

最後に、view.setData と view.setModel を再実装する必要があると思いますか? setModel は各モデル行をループして QTableView を構築し、setData は適切なクエリを実行してモデルに新しいデータを追加しますか?

を使用して設定した編集方法に応じて、setEditStrategy表のセルを編集するとき、または を使用して送信した後に、変更がコミットされますsubmitAll

また、 も参照してQDataWidgetMapperください。モデル データをさまざまなウィジェットにマップし、それらのウィジェットを編集している変更を追跡できます。

于 2013-03-20T13:24:15.537 に答える