#include #include #include #include #include #include #include #include #include #include class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0) : QMainWindow(parent) { QWidget *w = new QWidget(this); setCentralWidget(w); QVBoxLayout *l = new QVBoxLayout(w); QLineEdit *edit1 = new QLineEdit(w); QLineEdit *edit2 = new QLineEdit(w); QPushButton *button1 = new QPushButton("Submit", w); QPushButton *button2 = new QPushButton("Go to first", w); QPushButton *button3 = new QPushButton("Go to last", w); l->addWidget(edit1); l->addWidget(edit2); l->addWidget(button1); l->addWidget(button2); l->addWidget(button3); QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("sample.sqlite"); if (!db.open()) { Q_ASSERT(0); } QSqlQuery q(db); if (q.exec("CREATE TABLE fields (field1 VARCHAR(128), field2 VARCHAR(128));")) { q.exec("INSERT INTO fields (field1, field2) VALUES ('aaaaa', 'bbbbb')"); q.exec("INSERT INTO fields (field1, field2) VALUES ('ccccc', 'ddddd')"); } model = new QSqlTableModel(this); model->setTable("fields"); model->select(); model->setEditStrategy(QSqlTableModel::OnFieldChange); mapper = new QDataWidgetMapper(this); mapper->setModel(model); mapper->setSubmitPolicy(QDataWidgetMapper::ManualSubmit); mapper->setItemDelegate(new QItemDelegate(this)); mapper->addMapping(edit1, model->fieldIndex("field1")); mapper->addMapping(edit2, model->fieldIndex("field2")); mapper->toFirst(); connect(button1, &QPushButton::clicked, this, &MainWindow::onButtonClicked); connect(button2, &QPushButton::clicked, mapper, &QDataWidgetMapper::toFirst); connect(button3, &QPushButton::clicked, mapper, &QDataWidgetMapper::toLast); } private slots: void onButtonClicked() { disconnect(model, &QSqlTableModel::dataChanged, mapper, 0); mapper->submit(); } private: QSqlTableModel *model; QDataWidgetMapper *mapper; }; #include "modified_main.moc" int main(int argc, char **argv) { QApplication app(argc, argv); MainWindow mw; mw.show(); return app.exec(); }