QTableView をグリッド テーブルのように動作させようとしています。つまり、ユーザー入力の新しいレコードが挿入される場所には、常に 1 つの空の行があります。MS Access のサブフォームを考えてみてください。または、Web 開発ではインライン編集と呼んでいると思います。
私はかなり標準的なコードであるQt 4.7.4を使用しています:
model = new QSqlTableModel(this);
model->setTable("order_details");
models->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->setFilter(QString("parent_id = '%1'").arg(ID->toString());
model->select();
model->insertRow(model->rowCount()); //worked womehow
//QSqlRecord rec = model->record();
//rec.setValue("fieldName", var); //useful for initializing some fields
//model->insertRecord(-1, rec); //internally call insertRow(rowCount()) then setRecord
ui->tblGrid->setModel(model);
コンストラクターに insertRow または insertRecord を指定しても、何も起こりません。行は追加されません。しかし、それらのいずれかを呼び出すプッシュボタンを作成すると、新しい行が追加されますが、編集できません。
これを観察するには、 Qt のキャッシュされたテーブルの例を変更してみてください。ただし、プッシュ ボタンから呼び出されたスロットでは、問題なく行が追加されます。もちろん、編集不可。
だから私の質問は:
- なぜこうなった?QSqlTableModel のソース コードを十分に確認しましたが、それを理解するには、QSqlRecord、QSqlQuery、QAbstractItemModel なども理解する必要があります。
- 編集できない行を回避するために、Qt::ItemIsEditable と Qt::ItemIsenabled を無効にするために QSqlTableModel オーバーライド flags() をサブクラス化しました。私は何を間違えましたか?
- 私は最終的に QTableView をサブクラス化してこの動作を取得することを知っているので、誰かが私へのポインタ、おそらく私が読むことができるプロジェクトのソースを持っているとありがたいです。
ありがとうございました、
エヴァン