2

QT フレームワークの一部に関して問題があります。私は QT 5.0.2 を使用しており、現在 Windows で開発しています。

私のアプリケーションでは、QSqlRelationalTableModel を使用して Tableview をセットアップしています。その隣には、リレーショナル テーブル モデルに接続されたテキスト フィールドと 3 つのコンボ ボックスがあります。ウィジェットは、次のように QDataWidgetMapper を使用してモデルにマップされます。

mapper = new QDataWidgetMapper(this);
mapper->setModel(model);
mapper->setItemDelegate(new QSqlRelationalDelegate(this));
mapper->setSubmitPolicy(QDataWidgetMapper::ManualSubmit);
mapper->addMapping(ui->courseComboBox, model->fieldIndex("course_shortcode"));
mapper->addMapping(ui->subjectComboBox, model->fieldIndex("subject_name"));
mapper->addMapping(ui->lecturerComboBox, model->fieldIndex("lecturer_name"));
mapper->addMapping(ui->themesTextEdit, model->fieldIndex("event_themes"));

ご覧のとおり、SubmitPolicy は手動送信に設定されています。ウィジェットの下に、保存ボタンとリセット ボタンを含むボタンボックスがあります。

保存ボタンがクリックされると、私はこれを行います:

qDebug() << this->mapper->submit();
qDebug() << model->lastError().text();

これにより、次の出力が作成されます。

true 
" " 

これは、送信が成功し、エラーが報告されなかったことを意味します。

それにもかかわらず、モデルで更新されるのは最初のフィールドだけです。他のすべてのウィジェットは、それらの値を元のモデルの値にリセットします (モデルが datachanged を発行し、マッパーが自分自身を接続したためだと思います)。

マッピングの 1 つまたは 2 つを削除しようとしましたが、最初にマッピングが追加されたフィールドのみが常に更新されます。

submitPolicy を autoSubmit に変更すると、マッパーは意図したとおりに機能します。しかし、これらのリセットボタンと適用ボタンが必要であり、変更時にデータが送信されないようにする必要があります。

これはQTBug 1086の発生のようですが、そのバグは修正されており、コードからのバグ レポートから問題を再現することもできません。

あなたが私を助けてくれることを願っています。

4

1 に答える 1

3

ドキュメントを誤解したため、回答を編集し、適切な説明を受け取った後、最終的に目的の結果を得るための正しい方法を取得しました。QSqlTableModel::setEditStrategy() を使用してモデル編集戦略を変更し、それを QSqlTableModel::OnRowChange に変更するだけです。これは、最初の列の変更後にマップされたウィジェットのコンテンツの更新を生成するような、単一の列の変更ごとに基になる DB に送信される変更を回避するために必要です。

于 2013-06-19T11:04:19.643 に答える