add strategy support to sqlbrowser example
authorMark Brand <mabrand@mabrand.nl>
Wed, 15 Feb 2012 10:23:54 +0000 (11:23 +0100)
committerQt by Nokia <qt-info@nokia.com>
Tue, 6 Mar 2012 05:34:33 +0000 (06:34 +0100)
Several useful options added to context menu.

Also added yellow background for unsubmitted
changes.

Change-Id: I132cd4498a5fb7275ea10c0497910aba99c06a2b
Reviewed-by: Honglei Zhang <honglei.zhang@nokia.com>
Reviewed-by: Yunqiao Yin <charles.yin@nokia.com>
examples/sql/sqlbrowser/browser.cpp
examples/sql/sqlbrowser/browser.h
examples/sql/sqlbrowser/browserwidget.ui

index 3aa330e..eaaec25 100644 (file)
@@ -52,6 +52,12 @@ Browser::Browser(QWidget *parent)
 
     table->addAction(insertRowAction);
     table->addAction(deleteRowAction);
+    table->addAction(fieldStrategyAction);
+    table->addAction(rowStrategyAction);
+    table->addAction(manualStrategyAction);
+    table->addAction(submitAction);
+    table->addAction(revertAction);
+    table->addAction(selectAction);
 
     if (QSqlDatabase::drivers().isEmpty())
         QMessageBox::information(this, tr("No database drivers found"),
@@ -144,7 +150,7 @@ void Browser::addConnection()
 
 void Browser::showTable(const QString &t)
 {
-    QSqlTableModel *model = new QSqlTableModel(table, connectionWidget->currentDatabase());
+    QSqlTableModel *model = new CustomModel(table, connectionWidget->currentDatabase());
     model->setEditStrategy(QSqlTableModel::OnRowChange);
     model->setTable(connectionWidget->currentDatabase().driver()->escapeIdentifier(t, QSqlDriver::TableName));
     model->select();
@@ -215,8 +221,6 @@ void Browser::deleteRow()
     if (!model)
         return;
 
-    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
-
     QModelIndexList currentSelection = table->selectionModel()->selectedIndexes();
     for (int i = 0; i < currentSelection.count(); ++i) {
         if (currentSelection.at(i).column() != 0)
@@ -224,24 +228,79 @@ void Browser::deleteRow()
         model->removeRow(currentSelection.at(i).row());
     }
 
-    model->submitAll();
-    model->setEditStrategy(QSqlTableModel::OnRowChange);
-
     updateActions();
 }
 
 void Browser::updateActions()
 {
-    bool enableIns = qobject_cast<QSqlTableModel *>(table->model());
+    QSqlTableModel * tm = qobject_cast<QSqlTableModel *>(table->model());
+    bool enableIns = tm;
     bool enableDel = enableIns && table->currentIndex().isValid();
 
     insertRowAction->setEnabled(enableIns);
     deleteRowAction->setEnabled(enableDel);
+
+    fieldStrategyAction->setEnabled(tm);
+    rowStrategyAction->setEnabled(tm);
+    manualStrategyAction->setEnabled(tm);
+    submitAction->setEnabled(tm);
+    revertAction->setEnabled(tm);
+    selectAction->setEnabled(tm);
+
+    if (tm) {
+        QSqlTableModel::EditStrategy es = tm->editStrategy();
+        fieldStrategyAction->setChecked(es == QSqlTableModel::OnFieldChange);
+        rowStrategyAction->setChecked(es == QSqlTableModel::OnRowChange);
+        manualStrategyAction->setChecked(es == QSqlTableModel::OnManualSubmit);
+    }
 }
 
 void Browser::about()
 {
     QMessageBox::about(this, tr("About"), tr("The SQL Browser demonstration "
         "shows how a data browser can be used to visualize the results of SQL"
-        "statements on a live database"));
+                                             "statements on a live database"));
+}
+
+void Browser::on_fieldStrategyAction_triggered()
+{
+    QSqlTableModel * tm = qobject_cast<QSqlTableModel *>(table->model());
+    if (tm)
+        tm->setEditStrategy(QSqlTableModel::OnFieldChange);
+}
+
+void Browser::on_rowStrategyAction_triggered()
+{
+    QSqlTableModel * tm = qobject_cast<QSqlTableModel *>(table->model());
+    if (tm)
+        tm->setEditStrategy(QSqlTableModel::OnRowChange);
+}
+
+void Browser::on_manualStrategyAction_triggered()
+{
+    QSqlTableModel * tm = qobject_cast<QSqlTableModel *>(table->model());
+    if (tm)
+        tm->setEditStrategy(QSqlTableModel::OnManualSubmit);
+}
+
+void Browser::on_submitAction_triggered()
+{
+    QSqlTableModel * tm = qobject_cast<QSqlTableModel *>(table->model());
+    if (tm)
+        tm->submitAll();
+}
+
+void Browser::on_revertAction_triggered()
+{
+    QSqlTableModel * tm = qobject_cast<QSqlTableModel *>(table->model());
+    if (tm)
+        tm->revertAll();
+}
+
+void Browser::on_selectAction_triggered()
+{
+    QSqlTableModel * tm = qobject_cast<QSqlTableModel *>(table->model());
+    if (tm)
+        tm->select();
 }
+
index 0769812..e9f4534 100644 (file)
@@ -43,6 +43,7 @@
 #define BROWSER_H
 
 #include <QWidget>
+#include <QSqlTableModel>
 #include "ui_browserwidget.h"
 
 class ConnectionWidget;
@@ -77,6 +78,12 @@ public slots:
     { insertRow(); }
     void on_deleteRowAction_triggered()
     { deleteRow(); }
+    void on_fieldStrategyAction_triggered();
+    void on_rowStrategyAction_triggered();
+    void on_manualStrategyAction_triggered();
+    void on_submitAction_triggered();
+    void on_revertAction_triggered();
+    void on_selectAction_triggered();
     void on_connectionWidget_tableActivated(const QString &table)
     { showTable(table); }
     void on_connectionWidget_metaDataRequested(const QString &table)
@@ -96,4 +103,17 @@ signals:
     void statusMessage(const QString &message);
 };
 
+class CustomModel: public QSqlTableModel
+{
+    Q_OBJECT
+public:
+    CustomModel(QObject *parent = 0, QSqlDatabase db = QSqlDatabase()):QSqlTableModel(parent, db) {}
+    QVariant data(const QModelIndex &idx, int role) const
+    {
+        if (role == Qt::BackgroundRole && isDirty(idx))
+            return QBrush(QColor(Qt::yellow));
+        return QSqlTableModel::data(idx, role);
+    }
+};
+
 #endif
index 20946f0..ff65b1f 100644 (file)
@@ -1,10 +1,8 @@
-<ui version="4.0" >
- <author></author>
- <comment></comment>
- <exportmacro></exportmacro>
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
  <class>Browser</class>
- <widget class="QWidget" name="Browser" >
-  <property name="geometry" >
+ <widget class="QWidget" name="Browser">
+  <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <height>515</height>
    </rect>
   </property>
-  <property name="windowTitle" >
+  <property name="windowTitle">
    <string>Qt SQL Browser</string>
   </property>
-  <layout class="QVBoxLayout" >
-   <property name="margin" >
-    <number>8</number>
-   </property>
-   <property name="spacing" >
+  <layout class="QVBoxLayout">
+   <property name="spacing">
     <number>6</number>
    </property>
+   <property name="margin">
+    <number>8</number>
+   </property>
    <item>
-    <widget class="QSplitter" name="splitter_2" >
-     <property name="sizePolicy" >
-      <sizepolicy>
-       <hsizetype>7</hsizetype>
-       <vsizetype>7</vsizetype>
+    <widget class="QSplitter" name="splitter_2">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
        <horstretch>0</horstretch>
        <verstretch>0</verstretch>
       </sizepolicy>
      </property>
-     <property name="orientation" >
+     <property name="orientation">
       <enum>Qt::Horizontal</enum>
      </property>
-     <widget class="ConnectionWidget" name="connectionWidget" >
-      <property name="sizePolicy" >
-       <sizepolicy>
-        <hsizetype>13</hsizetype>
-        <vsizetype>7</vsizetype>
+     <widget class="ConnectionWidget" name="connectionWidget">
+      <property name="sizePolicy">
+       <sizepolicy hsizetype="Ignored" vsizetype="Expanding">
         <horstretch>1</horstretch>
         <verstretch>0</verstretch>
        </sizepolicy>
       </property>
      </widget>
-     <widget class="QTableView" name="table" >
-      <property name="sizePolicy" >
-       <sizepolicy>
-        <hsizetype>7</hsizetype>
-        <vsizetype>7</vsizetype>
+     <widget class="QTableView" name="table">
+      <property name="sizePolicy">
+       <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
         <horstretch>2</horstretch>
         <verstretch>0</verstretch>
        </sizepolicy>
       </property>
-      <property name="contextMenuPolicy" >
+      <property name="contextMenuPolicy">
        <enum>Qt::ActionsContextMenu</enum>
       </property>
-      <property name="selectionBehavior" >
+      <property name="selectionBehavior">
        <enum>QAbstractItemView::SelectRows</enum>
       </property>
      </widget>
     </widget>
    </item>
    <item>
-    <widget class="QGroupBox" name="groupBox" >
-     <property name="sizePolicy" >
-      <sizepolicy>
-       <hsizetype>5</hsizetype>
-       <vsizetype>3</vsizetype>
+    <widget class="QGroupBox" name="groupBox">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
        <horstretch>0</horstretch>
        <verstretch>0</verstretch>
       </sizepolicy>
      </property>
-     <property name="maximumSize" >
+     <property name="maximumSize">
       <size>
        <width>16777215</width>
        <height>180</height>
       </size>
      </property>
-     <property name="title" >
+     <property name="title">
       <string>SQL Query</string>
      </property>
-     <layout class="QVBoxLayout" >
-      <property name="margin" >
-       <number>9</number>
-      </property>
-      <property name="spacing" >
+     <layout class="QVBoxLayout">
+      <property name="spacing">
        <number>6</number>
       </property>
+      <property name="margin">
+       <number>9</number>
+      </property>
       <item>
-       <widget class="QTextEdit" name="sqlEdit" >
-        <property name="sizePolicy" >
-         <sizepolicy>
-          <hsizetype>7</hsizetype>
-          <vsizetype>3</vsizetype>
+       <widget class="QTextEdit" name="sqlEdit">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Expanding" vsizetype="MinimumExpanding">
           <horstretch>0</horstretch>
           <verstretch>0</verstretch>
          </sizepolicy>
         </property>
-        <property name="minimumSize" >
+        <property name="minimumSize">
          <size>
           <width>0</width>
           <height>18</height>
          </size>
         </property>
-        <property name="baseSize" >
+        <property name="baseSize">
          <size>
           <width>0</width>
           <height>120</height>
        </widget>
       </item>
       <item>
-       <layout class="QHBoxLayout" >
-        <property name="margin" >
-         <number>1</number>
-        </property>
-        <property name="spacing" >
+       <layout class="QHBoxLayout">
+        <property name="spacing">
          <number>6</number>
         </property>
+        <property name="margin">
+         <number>1</number>
+        </property>
         <item>
          <spacer>
-          <property name="orientation" >
+          <property name="orientation">
            <enum>Qt::Horizontal</enum>
           </property>
-          <property name="sizeHint" >
+          <property name="sizeHint" stdset="0">
            <size>
             <width>40</width>
             <height>20</height>
          </spacer>
         </item>
         <item>
-         <widget class="QPushButton" name="clearButton" >
-          <property name="text" >
+         <widget class="QPushButton" name="clearButton">
+          <property name="text">
            <string>&amp;Clear</string>
           </property>
          </widget>
         </item>
         <item>
-         <widget class="QPushButton" name="submitButton" >
-          <property name="text" >
+         <widget class="QPushButton" name="submitButton">
+          <property name="text">
            <string>&amp;Submit</string>
           </property>
          </widget>
     </widget>
    </item>
   </layout>
-  <action name="insertRowAction" >
-   <property name="enabled" >
+  <action name="insertRowAction">
+   <property name="enabled">
     <bool>false</bool>
    </property>
-   <property name="text" >
+   <property name="text">
     <string>&amp;Insert Row</string>
    </property>
-   <property name="statusTip" >
+   <property name="statusTip">
     <string>Inserts a new Row</string>
    </property>
   </action>
-  <action name="deleteRowAction" >
-   <property name="enabled" >
+  <action name="deleteRowAction">
+   <property name="enabled">
     <bool>false</bool>
    </property>
-   <property name="text" >
+   <property name="text">
     <string>&amp;Delete Row</string>
    </property>
-   <property name="statusTip" >
+   <property name="statusTip">
     <string>Deletes the current Row</string>
    </property>
   </action>
+  <action name="fieldStrategyAction">
+   <property name="checkable">
+    <bool>true</bool>
+   </property>
+   <property name="text">
+    <string>Submit on &amp;Field Change</string>
+   </property>
+   <property name="toolTip">
+    <string>Commit on Field Change</string>
+   </property>
+  </action>
+  <action name="rowStrategyAction">
+   <property name="checkable">
+    <bool>true</bool>
+   </property>
+   <property name="text">
+    <string>Submit on &amp;Row Change</string>
+   </property>
+   <property name="toolTip">
+    <string>Commit on Row Change</string>
+   </property>
+  </action>
+  <action name="manualStrategyAction">
+   <property name="checkable">
+    <bool>true</bool>
+   </property>
+   <property name="text">
+    <string>Submit &amp;Manually</string>
+   </property>
+   <property name="toolTip">
+    <string>Commit Manually</string>
+   </property>
+  </action>
+  <action name="submitAction">
+   <property name="text">
+    <string>&amp;Submit All</string>
+   </property>
+   <property name="toolTip">
+    <string>Submit Changes</string>
+   </property>
+  </action>
+  <action name="revertAction">
+   <property name="text">
+    <string>&amp;Revert All</string>
+   </property>
+   <property name="toolTip">
+    <string>Revert</string>
+   </property>
+  </action>
+  <action name="selectAction">
+   <property name="text">
+    <string>S&amp;elect</string>
+   </property>
+   <property name="toolTip">
+    <string>Refresh Data from Database</string>
+   </property>
+  </action>
  </widget>
- <pixmapfunction></pixmapfunction>
  <customwidgets>
   <customwidget>
    <class>ConnectionWidget</class>
    <extends>QTreeView</extends>
    <header>connectionwidget.h</header>
-   <container>0</container>
-   <pixmap></pixmap>
   </customwidget>
  </customwidgets>
  <tabstops>