QTableView: call model->submit() on row change
authorMark Brand <mabrand@mabrand.nl>
Tue, 13 Mar 2012 10:40:25 +0000 (11:40 +0100)
committerQt by Nokia <qt-info@nokia.com>
Wed, 14 Mar 2012 23:50:47 +0000 (00:50 +0100)
QTreeView already does this in the exact same way. It's necessary to
call submit() so edit strategy OnRowChange in QSqlTableModel will
work as expected.

Change-Id: Ib430143e8a71f3b0bcd842fcc772cc7ee4525f0a
Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
src/widgets/itemviews/qtableview.cpp
tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp

index 57f2964..a5e03ca 100644 (file)
@@ -1071,6 +1071,10 @@ void QTableView::setModel(QAbstractItemModel *model)
         disconnect(d->model, SIGNAL(columnsRemoved(QModelIndex,int,int)),
                 this, SLOT(_q_updateSpanRemovedColumns(QModelIndex,int,int)));
     }
+    if (d->selectionModel) { // support row editing
+        disconnect(d->selectionModel, SIGNAL(currentRowChanged(QModelIndex,QModelIndex)),
+                   d->model, SLOT(submit()));
+    }
     if (model) { //and connect to the new one
         connect(model, SIGNAL(rowsInserted(QModelIndex,int,int)),
                 this, SLOT(_q_updateSpanInsertedRows(QModelIndex,int,int)));
@@ -1123,9 +1127,21 @@ void QTableView::setSelectionModel(QItemSelectionModel *selectionModel)
 {
     Q_D(QTableView);
     Q_ASSERT(selectionModel);
+    if (d->selectionModel) {
+        // support row editing
+        disconnect(d->selectionModel, SIGNAL(currentRowChanged(QModelIndex,QModelIndex)),
+                   d->model, SLOT(submit()));
+    }
+
     d->verticalHeader->setSelectionModel(selectionModel);
     d->horizontalHeader->setSelectionModel(selectionModel);
     QAbstractItemView::setSelectionModel(selectionModel);
+
+    if (d->selectionModel) {
+        // support row editing
+        connect(d->selectionModel, SIGNAL(currentRowChanged(QModelIndex,QModelIndex)),
+                d->model, SLOT(submit()));
+    }
 }
 
 /*!
index 9144a02..0c396aa 100644 (file)
@@ -175,6 +175,7 @@ private slots:
     void tabFocus();
     void bigModel();
     void selectionSignal();
+    void setCurrentIndex();
 
     // task-specific tests:
     void task173773_updateVerticalHeader();
@@ -254,11 +255,15 @@ class QtTestTableModel: public QAbstractTableModel
 signals:
     void invalidIndexEncountered() const;
 
+public slots:
+    bool submit() { ++submit_count; return QAbstractTableModel::submit(); }
+
 public:
     QtTestTableModel(int rows = 0, int columns = 0, QObject *parent = 0)
         : QAbstractTableModel(parent),
           row_count(rows),
           column_count(columns),
+          submit_count(0),
           can_fetch_more(false),
           fetch_more_count(0),
           disabled_rows(),
@@ -400,6 +405,7 @@ public:
 
     int row_count;
     int column_count;
+    int submit_count;
     bool can_fetch_more;
     int fetch_more_count;
     QSet<int> disabled_rows;
@@ -3480,6 +3486,27 @@ void tst_QTableView::selectionSignal()
     QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, view.visualRect(model.index(2, 0)).center());
 }
 
+void tst_QTableView::setCurrentIndex()
+{
+    QtTestTableModel model(4, 4);
+    QtTestTableView view;
+    view.setModel(&model);
+
+    // submit() slot should be called in model when current row changes
+    view.setCurrentIndex(model.index(0,0));
+    QCOMPARE(model.submit_count, 1);
+    view.setCurrentIndex(model.index(0,2));
+    QCOMPARE(model.submit_count, 1);
+    view.setCurrentIndex(model.index(1,0));
+    QCOMPARE(model.submit_count, 2);
+    view.setCurrentIndex(model.index(3,3));
+    QCOMPARE(model.submit_count, 3);
+    view.setCurrentIndex(model.index(0,1));
+    QCOMPARE(model.submit_count, 4);
+    view.setCurrentIndex(model.index(0,0));
+    QCOMPARE(model.submit_count, 4);
+}
+
 class task173773_EventFilter : public QObject
 {
     int paintEventCount_;