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の発生のようですが、そのバグは修正されており、コードからのバグ レポートから問題を再現することもできません。
あなたが私を助けてくれることを願っています。