diff options
Diffstat (limited to 'examples/sql/sqlbrowser/browser.cpp')
-rw-r--r-- | examples/sql/sqlbrowser/browser.cpp | 265 |
1 files changed, 126 insertions, 139 deletions
diff --git a/examples/sql/sqlbrowser/browser.cpp b/examples/sql/sqlbrowser/browser.cpp index 3efd8b77b4..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)"); @@ -141,43 +128,49 @@ void Browser::addConnection() q.exec("insert into Movies values (2, 'Bis ans Ende der Welt', 'Wim Wenders', '6.5')"); q.exec("insert into Movies values (3, 'Hardware', 'Richard Stanley', '5.2')"); q.exec("insert into Movies values (4, 'Mitchell', 'Andrew V. McLaglen', '2.1')"); - q.exec("create table Names (id integer primary key, Firstname varchar, Lastname varchar, City varchar)"); + q.exec("create table Names (id integer primary key, FirstName varchar, LastName varchar, City varchar)"); q.exec("insert into Names values (0, 'Sala', 'Palmer', 'Morristown')"); q.exec("insert into Names values (1, 'Christopher', 'Walker', 'Morristown')"); 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(); } - |