summaryrefslogtreecommitdiffstats
path: root/examples/sql/sqlbrowser/browser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/sql/sqlbrowser/browser.cpp')
-rw-r--r--examples/sql/sqlbrowser/browser.cpp263
1 files changed, 125 insertions, 138 deletions
diff --git a/examples/sql/sqlbrowser/browser.cpp b/examples/sql/sqlbrowser/browser.cpp
index c784ff7d1e..9a99999702 100644
--- a/examples/sql/sqlbrowser/browser.cpp
+++ b/examples/sql/sqlbrowser/browser.cpp
@@ -1,72 +1,51 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the demonstration applications of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-** * Redistributions of source code must retain the above copyright
-** notice, this list of conditions and the following disclaimer.
-** * Redistributions in binary form must reproduce the above copyright
-** notice, this list of conditions and the following disclaimer in
-** the documentation and/or other materials provided with the
-** distribution.
-** * Neither the name of The Qt Company Ltd nor the names of its
-** contributors may be used to endorse or promote products derived
-** from this software without specific prior written permission.
-**
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include "browser.h"
#include "qsqlconnectiondialog.h"
-
-#include <QtWidgets>
-#include <QtSql>
+#include <ui_browserwidget.h>
+
+#include <QAction>
+#include <QMessageBox>
+#include <QStandardItemModel>
+#include <QSqlDriver>
+#include <QSqlError>
+#include <QSqlField>
+#include <QSqlQuery>
+#include <QSqlRecord>
+#include <QTextEdit>
+#include <QTimer>
Browser::Browser(QWidget *parent)
: QWidget(parent)
+ , m_ui(new Ui::Browser)
{
- setupUi(this);
-
- table->addAction(insertRowAction);
- table->addAction(deleteRowAction);
- table->addAction(fieldStrategyAction);
- table->addAction(rowStrategyAction);
- table->addAction(manualStrategyAction);
- table->addAction(submitAction);
- table->addAction(revertAction);
- table->addAction(selectAction);
+ m_ui->setupUi(this);
+
+ m_ui->table->addAction(m_ui->insertRowAction);
+ m_ui->table->addAction(m_ui->deleteRowAction);
+ m_ui->table->addAction(m_ui->fieldStrategyAction);
+ m_ui->table->addAction(m_ui->rowStrategyAction);
+ m_ui->table->addAction(m_ui->manualStrategyAction);
+ m_ui->table->addAction(m_ui->submitAction);
+ m_ui->table->addAction(m_ui->revertAction);
+ m_ui->table->addAction(m_ui->selectAction);
+
+ connect(m_ui->insertRowAction, &QAction::triggered, this, &Browser::insertRow);
+ connect(m_ui->deleteRowAction, &QAction::triggered, this, &Browser::deleteRow);
+ connect(m_ui->fieldStrategyAction, &QAction::triggered, this, &Browser::onFieldStrategyAction);
+ connect(m_ui->rowStrategyAction, &QAction::triggered, this, &Browser::onRowStrategyAction);
+ connect(m_ui->sqlEdit, &QTextEdit::textChanged, this, &Browser::updateActions);
+
+ connect(m_ui->connectionWidget, &ConnectionWidget::tableActivated,
+ this, &Browser::showTable);
+ connect(m_ui->connectionWidget, &ConnectionWidget::metaDataRequested,
+ this, &Browser::showMetaData);
+
+ connect(m_ui->submitButton, &QPushButton::clicked,
+ this, &Browser::onSubmitButton);
+ connect(m_ui->clearButton, &QPushButton::clicked,
+ this, &Browser::onClearButton);
if (QSqlDatabase::drivers().isEmpty())
QMessageBox::information(this, tr("No database drivers found"),
@@ -74,18 +53,22 @@ Browser::Browser(QWidget *parent)
"Please check the documentation how to build the "
"Qt SQL plugins."));
- emit statusMessage(tr("Ready."));
+ QTimer::singleShot(0, this, [this]() {
+ updateActions();
+ emit statusMessage(tr("Ready."));
+ });
}
Browser::~Browser()
{
+ delete m_ui;
}
void Browser::exec()
{
- QSqlQueryModel *model = new QSqlQueryModel(table);
- model->setQuery(QSqlQuery(sqlEdit->toPlainText(), connectionWidget->currentDatabase()));
- table->setModel(model);
+ QSqlQueryModel *model = new QSqlQueryModel(m_ui->table);
+ model->setQuery(QSqlQuery(m_ui->sqlEdit->toPlainText(), m_ui->connectionWidget->currentDatabase()));
+ m_ui->table->setModel(model);
if (model->lastError().type() != QSqlError::NoError)
emit statusMessage(model->lastError().text());
@@ -99,7 +82,7 @@ void Browser::exec()
}
QSqlError Browser::addConnection(const QString &driver, const QString &dbName, const QString &host,
- const QString &user, const QString &passwd, int port)
+ const QString &user, const QString &passwd, int port)
{
static int cCount = 0;
@@ -113,12 +96,12 @@ QSqlError Browser::addConnection(const QString &driver, const QString &dbName, c
db = QSqlDatabase();
QSqlDatabase::removeDatabase(QString("Browser%1").arg(cCount));
}
- connectionWidget->refresh();
+ m_ui->connectionWidget->refresh();
return err;
}
-void Browser::addConnection()
+void Browser::openNewConnectionDialog()
{
QSqlConnectionDialog dialog(this);
if (dialog.exec() != QDialog::Accepted)
@@ -129,10 +112,14 @@ void Browser::addConnection()
QSqlDatabase::removeDatabase("in_mem_db");
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "in_mem_db");
db.setDatabaseName(":memory:");
- if (!db.open())
- QMessageBox::warning(this, tr("Unable to open database"), tr("An error occurred while "
- "opening the connection: ") + db.lastError().text());
- QSqlQuery q("", db);
+ if (!db.open()) {
+ QMessageBox::warning(this, tr("Unable to open database"),
+ tr("An error occurred while "
+ "opening the connection: %1") .arg(db.lastError().text()));
+ return;
+ }
+ db.transaction();
+ QSqlQuery q(db);
q.exec("drop table Movies");
q.exec("drop table Names");
q.exec("create table Movies (id integer primary key, Title varchar, Director varchar, Rating number)");
@@ -147,37 +134,43 @@ void Browser::addConnection()
q.exec("insert into Names values (2, 'Donald', 'Duck', 'Andeby')");
q.exec("insert into Names values (3, 'Buck', 'Rogers', 'Paris')");
q.exec("insert into Names values (4, 'Sherlock', 'Holmes', 'London')");
- connectionWidget->refresh();
+ db.commit();
+ m_ui->connectionWidget->refresh();
} else {
QSqlError err = addConnection(dialog.driverName(), dialog.databaseName(), dialog.hostName(),
- dialog.userName(), dialog.password(), dialog.port());
+ dialog.userName(), dialog.password(), dialog.port());
if (err.type() != QSqlError::NoError)
- QMessageBox::warning(this, tr("Unable to open database"), tr("An error occurred while "
- "opening the connection: ") + err.text());
+ QMessageBox::warning(this, tr("Unable to open database"),
+ tr("An error occurred while "
+ "opening the connection: %1").arg(err.text()));
}
}
void Browser::showTable(const QString &t)
{
- QSqlTableModel *model = new CustomModel(table, connectionWidget->currentDatabase());
+ QSqlTableModel *model = new CustomModel(m_ui->table, m_ui->connectionWidget->currentDatabase());
model->setEditStrategy(QSqlTableModel::OnRowChange);
- model->setTable(connectionWidget->currentDatabase().driver()->escapeIdentifier(t, QSqlDriver::TableName));
+ model->setTable(m_ui->connectionWidget->currentDatabase().driver()->escapeIdentifier(t, QSqlDriver::TableName));
model->select();
if (model->lastError().type() != QSqlError::NoError)
emit statusMessage(model->lastError().text());
- table->setModel(model);
- table->setEditTriggers(QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed);
- connect(table->selectionModel(), &QItemSelectionModel::currentRowChanged,
- this, &Browser::currentChanged);
+ m_ui->table->setModel(model);
+ m_ui->table->setEditTriggers(QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed);
+ connect(m_ui->table->selectionModel(), &QItemSelectionModel::currentRowChanged,
+ this, &Browser::updateActions);
+
+ connect(m_ui->submitAction, &QAction::triggered, model, &QSqlTableModel::submitAll);
+ connect(m_ui->revertAction, &QAction::triggered, model, &QSqlTableModel::revertAll);
+ connect(m_ui->selectAction, &QAction::triggered, model, &QSqlTableModel::select);
updateActions();
}
void Browser::showMetaData(const QString &t)
{
- QSqlRecord rec = connectionWidget->currentDatabase().record(t);
- QStandardItemModel *model = new QStandardItemModel(table);
+ QSqlRecord rec = m_ui->connectionWidget->currentDatabase().record(t);
+ QStandardItemModel *model = new QStandardItemModel(m_ui->table);
model->insertRows(0, rec.count());
model->insertColumns(0, 7);
@@ -193,9 +186,7 @@ void Browser::showMetaData(const QString &t)
for (int i = 0; i < rec.count(); ++i) {
QSqlField fld = rec.field(i);
model->setData(model->index(i, 0), fld.name());
- model->setData(model->index(i, 1), fld.typeID() == -1
- ? QString(fld.metaType().name())
- : QString("%1 (%2)").arg(fld.metaType().name()).arg(fld.typeID()));
+ model->setData(model->index(i, 1), QString::fromUtf8(fld.metaType().name()));
model->setData(model->index(i, 2), fld.length());
model->setData(model->index(i, 3), fld.precision());
model->setData(model->index(i, 4), fld.requiredStatus() == -1 ? QVariant("?")
@@ -204,37 +195,37 @@ void Browser::showMetaData(const QString &t)
model->setData(model->index(i, 6), fld.defaultValue());
}
- table->setModel(model);
- table->setEditTriggers(QAbstractItemView::NoEditTriggers);
+ m_ui->table->setModel(model);
+ m_ui->table->setEditTriggers(QAbstractItemView::NoEditTriggers);
updateActions();
}
void Browser::insertRow()
{
- QSqlTableModel *model = qobject_cast<QSqlTableModel *>(table->model());
+ QSqlTableModel *model = qobject_cast<QSqlTableModel *>(m_ui->table->model());
if (!model)
return;
- QModelIndex insertIndex = table->currentIndex();
+ QModelIndex insertIndex = m_ui->table->currentIndex();
int row = insertIndex.row() == -1 ? 0 : insertIndex.row();
model->insertRow(row);
insertIndex = model->index(row, 0);
- table->setCurrentIndex(insertIndex);
- table->edit(insertIndex);
+ m_ui->table->setCurrentIndex(insertIndex);
+ m_ui->table->edit(insertIndex);
}
void Browser::deleteRow()
{
- QSqlTableModel *model = qobject_cast<QSqlTableModel *>(table->model());
+ QSqlTableModel *model = qobject_cast<QSqlTableModel *>(m_ui->table->model());
if (!model)
return;
- QModelIndexList currentSelection = table->selectionModel()->selectedIndexes();
- for (int i = 0; i < currentSelection.count(); ++i) {
- if (currentSelection.at(i).column() != 0)
+ const QModelIndexList currentSelection = m_ui->table->selectionModel()->selectedIndexes();
+ for (const auto &idx : currentSelection) {
+ if (idx.column() != 0)
continue;
- model->removeRow(currentSelection.at(i).row());
+ model->removeRow(idx.row());
}
updateActions();
@@ -242,74 +233,70 @@ void Browser::deleteRow()
void Browser::updateActions()
{
- QSqlTableModel * tm = qobject_cast<QSqlTableModel *>(table->model());
- bool enableIns = tm;
- bool enableDel = enableIns && table->currentIndex().isValid();
+ QSqlTableModel *tm = qobject_cast<QSqlTableModel *>(m_ui->table->model());
+ bool enableIns = tm != nullptr;
+ bool enableDel = enableIns && m_ui->table->currentIndex().isValid();
- insertRowAction->setEnabled(enableIns);
- deleteRowAction->setEnabled(enableDel);
+ m_ui->insertRowAction->setEnabled(enableIns);
+ m_ui->deleteRowAction->setEnabled(enableDel);
- fieldStrategyAction->setEnabled(tm);
- rowStrategyAction->setEnabled(tm);
- manualStrategyAction->setEnabled(tm);
- submitAction->setEnabled(tm);
- revertAction->setEnabled(tm);
- selectAction->setEnabled(tm);
+ m_ui->submitAction->setEnabled(tm);
+ m_ui->revertAction->setEnabled(tm);
+ m_ui->selectAction->setEnabled(tm);
+
+ const bool isEmpty = m_ui->sqlEdit->toPlainText().isEmpty();
+ m_ui->submitButton->setEnabled(m_ui->connectionWidget->currentDatabase().isOpen() && !isEmpty);
+ m_ui->clearButton->setEnabled(!isEmpty);
if (tm) {
QSqlTableModel::EditStrategy es = tm->editStrategy();
- fieldStrategyAction->setChecked(es == QSqlTableModel::OnFieldChange);
- rowStrategyAction->setChecked(es == QSqlTableModel::OnRowChange);
- manualStrategyAction->setChecked(es == QSqlTableModel::OnManualSubmit);
+ m_ui->fieldStrategyAction->setChecked(es == QSqlTableModel::OnFieldChange);
+ m_ui->rowStrategyAction->setChecked(es == QSqlTableModel::OnRowChange);
+ m_ui->manualStrategyAction->setChecked(es == QSqlTableModel::OnManualSubmit);
+ } else {
+ m_ui->fieldStrategyAction->setEnabled(false);
+ m_ui->rowStrategyAction->setEnabled(false);
+ m_ui->manualStrategyAction->setEnabled(false);
}
}
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"));
+ 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"));
}
-void Browser::on_fieldStrategyAction_triggered()
+void Browser::onFieldStrategyAction()
{
- QSqlTableModel * tm = qobject_cast<QSqlTableModel *>(table->model());
+ QSqlTableModel *tm = qobject_cast<QSqlTableModel *>(m_ui->table->model());
if (tm)
tm->setEditStrategy(QSqlTableModel::OnFieldChange);
}
-void Browser::on_rowStrategyAction_triggered()
+void Browser::onRowStrategyAction()
{
- QSqlTableModel * tm = qobject_cast<QSqlTableModel *>(table->model());
+ QSqlTableModel *tm = qobject_cast<QSqlTableModel *>(m_ui->table->model());
if (tm)
tm->setEditStrategy(QSqlTableModel::OnRowChange);
}
-void Browser::on_manualStrategyAction_triggered()
+void Browser::onManualStrategyAction()
{
- QSqlTableModel * tm = qobject_cast<QSqlTableModel *>(table->model());
+ QSqlTableModel *tm = qobject_cast<QSqlTableModel *>(m_ui->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()
+void Browser::onSubmitButton()
{
- QSqlTableModel * tm = qobject_cast<QSqlTableModel *>(table->model());
- if (tm)
- tm->revertAll();
+ exec();
+ m_ui->sqlEdit->setFocus();
}
-void Browser::on_selectAction_triggered()
+void Browser::onClearButton()
{
- QSqlTableModel * tm = qobject_cast<QSqlTableModel *>(table->model());
- if (tm)
- tm->select();
+ m_ui->sqlEdit->clear();
+ m_ui->sqlEdit->setFocus();
}
-