diff options
Diffstat (limited to 'examples/sql/books')
-rw-r--r-- | examples/sql/books/CMakeLists.txt | 55 | ||||
-rw-r--r-- | examples/sql/books/bookdelegate.cpp | 101 | ||||
-rw-r--r-- | examples/sql/books/bookdelegate.h | 57 | ||||
-rw-r--r-- | examples/sql/books/books.pro | 1 | ||||
-rw-r--r-- | examples/sql/books/books.qrc | 3 | ||||
-rw-r--r-- | examples/sql/books/bookwindow.cpp | 258 | ||||
-rw-r--r-- | examples/sql/books/bookwindow.h | 89 | ||||
-rw-r--r-- | examples/sql/books/bookwindow.ui | 164 | ||||
-rw-r--r-- | examples/sql/books/images/star-filled.svg | 1 | ||||
-rw-r--r-- | examples/sql/books/images/star.png | bin | 782 -> 0 bytes | |||
-rw-r--r-- | examples/sql/books/images/star.svg | 1 | ||||
-rw-r--r-- | examples/sql/books/initdb.h | 55 | ||||
-rw-r--r-- | examples/sql/books/main.cpp | 55 |
13 files changed, 256 insertions, 584 deletions
diff --git a/examples/sql/books/CMakeLists.txt b/examples/sql/books/CMakeLists.txt index b8bab04702..3fff917163 100644 --- a/examples/sql/books/CMakeLists.txt +++ b/examples/sql/books/CMakeLists.txt @@ -1,53 +1,39 @@ -# Generated from books.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause cmake_minimum_required(VERSION 3.16) project(books LANGUAGES CXX) -set(CMAKE_INCLUDE_CURRENT_DIR ON) +find_package(Qt6 REQUIRED COMPONENTS Core Gui Sql Widgets) -set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTORCC ON) -set(CMAKE_AUTOUIC ON) - -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/sql/books") - -find_package(Qt6 COMPONENTS Core) -find_package(Qt6 COMPONENTS Gui) -find_package(Qt6 COMPONENTS Sql) -find_package(Qt6 COMPONENTS Widgets) +qt_standard_project_setup() qt_add_executable(books bookdelegate.cpp bookdelegate.h - bookwindow.cpp bookwindow.h bookwindow.ui + bookwindow.cpp bookwindow.h initdb.h main.cpp ) + set_target_properties(books PROPERTIES WIN32_EXECUTABLE TRUE MACOSX_BUNDLE TRUE ) -target_include_directories(books PUBLIC - . -) -target_link_libraries(books PUBLIC - Qt::Core - Qt::Gui - Qt::Sql - Qt::Widgets +target_link_libraries(books PRIVATE + Qt6::Core + Qt6::Gui + Qt6::Sql + Qt6::Widgets ) - # Resources: set(books_resource_files - "images/star.png" + "images/star.svg" + "images/star-filled.svg" ) -qt6_add_resources(books "books" +qt_add_resources(books "books" PREFIX "/" FILES @@ -55,7 +41,14 @@ qt6_add_resources(books "books" ) install(TARGETS books - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" + BUNDLE DESTINATION . + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} +) + +qt_generate_deploy_app_script( + TARGET books + OUTPUT_SCRIPT deploy_script + NO_UNSUPPORTED_PLATFORM_ERROR ) +install(SCRIPT ${deploy_script}) diff --git a/examples/sql/books/bookdelegate.cpp b/examples/sql/books/bookdelegate.cpp index 56d9b1f414..ead9f9e7db 100644 --- a/examples/sql/books/bookdelegate.cpp +++ b/examples/sql/books/bookdelegate.cpp @@ -1,64 +1,15 @@ -/**************************************************************************** -** -** 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 "bookdelegate.h" -#include <QtWidgets> +#include <QMouseEvent> +#include <QPainter> +#include <QSpinBox> -BookDelegate::BookDelegate(QObject *parent) - : QSqlRelationalDelegate(parent), star(QPixmap(":images/star.png")) -{ -} - -void BookDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, - const QModelIndex &index) const +void BookDelegate::paint(QPainter *painter, + const QStyleOptionViewItem &option, + const QModelIndex &index) const { if (index.column() != 5) { QSqlRelationalDelegate::paint(painter, option, index); @@ -75,31 +26,33 @@ void BookDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, option.rect, option.palette.color(cg, QPalette::Highlight)); - int rating = model->data(index, Qt::DisplayRole).toInt(); - int width = star.width(); - int height = star.height(); - int x = option.rect.x(); + const int rating = model->data(index, Qt::DisplayRole).toInt(); + const int width = iconDimension; + const int height = width; + // add cellPadding / 2 to center the stars in the cell + int x = option.rect.x() + cellPadding / 2; int y = option.rect.y() + (option.rect.height() / 2) - (height / 2); - for (int i = 0; i < rating; ++i) { - painter->drawPixmap(x, y, star); + + QIcon starIcon(QStringLiteral(":images/star.svg")); + QIcon starFilledIcon(QStringLiteral(":images/star-filled.svg")); + + for (int i = 0; i < 5; ++i) { + if (i < rating) + starFilledIcon.paint(painter, QRect(x, y, width, height)); + else + starIcon.paint(painter, QRect(x, y, width, height)); x += width; } } - - QPen pen = painter->pen(); - painter->setPen(option.palette.color(QPalette::Mid)); - painter->drawLine(option.rect.bottomLeft(), option.rect.bottomRight()); - painter->drawLine(option.rect.topRight(), option.rect.bottomRight()); - painter->setPen(pen); } QSize BookDelegate::sizeHint(const QStyleOptionViewItem &option, - const QModelIndex &index) const + const QModelIndex &index) const { if (index.column() == 5) - return QSize(5 * star.width(), star.height()) + QSize(1, 1); + return QSize(5 * iconDimension, iconDimension) + QSize(cellPadding, cellPadding); // Since we draw the grid ourselves: - return QSqlRelationalDelegate::sizeHint(option, index) + QSize(1, 1); + return QSqlRelationalDelegate::sizeHint(option, index) + QSize(cellPadding, cellPadding); } bool BookDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, @@ -111,8 +64,8 @@ bool BookDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, if (event->type() == QEvent::MouseButtonPress) { QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event); - int stars = qBound(0, int(0.7 + qreal(mouseEvent->position().toPoint().x() - - option.rect.x()) / star.width()), 5); + int stars = qBound(0, int(0.7 + qreal(mouseEvent->position().x() + - option.rect.x()) / iconDimension), 5); model->setData(index, QVariant(stars)); // So that the selection can change: return false; diff --git a/examples/sql/books/bookdelegate.h b/examples/sql/books/bookdelegate.h index f1b4326992..b36cb371ac 100644 --- a/examples/sql/books/bookdelegate.h +++ b/examples/sql/books/bookdelegate.h @@ -1,58 +1,10 @@ -/**************************************************************************** -** -** 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 #ifndef BOOKDELEGATE_H #define BOOKDELEGATE_H #include <QModelIndex> -#include <QPixmap> #include <QSize> #include <QSqlRelationalDelegate> @@ -61,7 +13,7 @@ QT_FORWARD_DECLARE_CLASS(QPainter) class BookDelegate : public QSqlRelationalDelegate { public: - BookDelegate(QObject *parent); + using QSqlRelationalDelegate::QSqlRelationalDelegate; void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; @@ -77,7 +29,8 @@ public: const QModelIndex &index) const override; private: - QPixmap star; + const int cellPadding = 6; + const int iconDimension = 24; }; #endif diff --git a/examples/sql/books/books.pro b/examples/sql/books/books.pro index 870e4a6c00..953945912e 100644 --- a/examples/sql/books/books.pro +++ b/examples/sql/books/books.pro @@ -4,7 +4,6 @@ INCLUDEPATH += . HEADERS = bookdelegate.h bookwindow.h initdb.h RESOURCES = books.qrc SOURCES = bookdelegate.cpp main.cpp bookwindow.cpp -FORMS = bookwindow.ui QT += sql widgets widgets requires(qtConfig(tableview)) diff --git a/examples/sql/books/books.qrc b/examples/sql/books/books.qrc index 342638ecb0..1a4dac32cc 100644 --- a/examples/sql/books/books.qrc +++ b/examples/sql/books/books.qrc @@ -1,5 +1,6 @@ <!DOCTYPE RCC><RCC version="1.0"> <qresource prefix="/"> - <file>images/star.png</file> + <file>images/star.svg</file> + <file>images/star-filled.svg</file> </qresource> </RCC> diff --git a/examples/sql/books/bookwindow.cpp b/examples/sql/books/bookwindow.cpp index 76f3c9da8f..6de2d5e80a 100644 --- a/examples/sql/books/bookwindow.cpp +++ b/examples/sql/books/bookwindow.cpp @@ -1,69 +1,31 @@ -/**************************************************************************** -** -** 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 "bookwindow.h" #include "bookdelegate.h" #include "initdb.h" -#include <QtSql> +#include <QApplication> +#include <QComboBox> +#include <QDataWidgetMapper> +#include <QGridLayout> +#include <QHeaderView> +#include <QLabel> +#include <QLineEdit> +#include <QMenu> +#include <QMenuBar> +#include <QMessageBox> +#include <QPainter> +#include <QScrollBar> +#include <QSpinBox> +#include <QSqlDatabase> +#include <QTableView> BookWindow::BookWindow() { - ui.setupUi(this); - if (!QSqlDatabase::drivers().contains("QSQLITE")) - QMessageBox::critical( - this, - "Unable to load database", - "This demo needs the SQLITE driver" - ); + QMessageBox::critical(this, tr("Unable to load database"), + tr("This demo needs the SQLITE driver")); // Initialize the database: QSqlError err = initDb(); @@ -72,20 +34,87 @@ BookWindow::BookWindow() return; } - // Create the data model: - model = new QSqlRelationalTableModel(ui.bookTable); + // create the central widget for the window + window = new QWidget(this); + setCentralWidget(window); + + createLayout(); + + createModel(); + + // Populate the model + if (!model->select()) { + showError(model->lastError()); + return; + } + + configureWidgets(); + + // create the mappings between the UI elements and the SQL model + createMappings(); + + tableView->setCurrentIndex(model->index(0, 0)); + tableView->selectRow(0); + + createMenuBar(); +} + +void BookWindow::showError(const QSqlError &err) +{ + QMessageBox::critical(this, tr("Unable to initialize Database"), + tr("Error initializing database: %1").arg(err.text())); +} + +void BookWindow::createLayout() +{ + tableView = new QTableView(window); + + gridLayout = new QGridLayout(window); + + titleLabel = new QLabel(tr("Title:"), window); + titleLineEdit = new QLineEdit(window); + authorLabel = new QLabel(tr("Author:"), window); + authorComboBox = new QComboBox(window); + genreLabel = new QLabel(tr("Genre:"), window); + genreComboBox = new QComboBox(window); + yearLabel = new QLabel(tr("Year:"), window); + yearSpinBox = new QSpinBox(window); + ratingLabel = new QLabel(tr("Rating:"), window); + ratingComboBox = new QComboBox(window); + + gridLayout->addWidget(titleLabel, 0, 0, Qt::AlignRight); + gridLayout->addWidget(titleLineEdit, 0, 1, 1, 3); + gridLayout->addWidget(authorLabel, 1, 0, Qt::AlignRight); + gridLayout->addWidget(authorComboBox, 1, 1); + gridLayout->addWidget(yearLabel, 1, 2, Qt::AlignRight); + gridLayout->addWidget(yearSpinBox, 1, 3); + gridLayout->addWidget(genreLabel, 2, 0, Qt::AlignRight); + gridLayout->addWidget(genreComboBox, 2, 1); + gridLayout->addWidget(ratingLabel, 2, 2, Qt::AlignRight); + gridLayout->addWidget(ratingComboBox, 2, 3); + gridLayout->addWidget(tableView, 3, 0, 1, 4, Qt::AlignCenter); + gridLayout->setColumnStretch(1, 1000); + gridLayout->setColumnStretch(3, 1000); + + gridLayout->setContentsMargins(18, 18, 18, 18); + gridLayout->setSpacing(18); + gridLayout->setAlignment(Qt::AlignHCenter); +} + +void BookWindow::createModel() +{ + model = new QSqlRelationalTableModel(tableView); model->setEditStrategy(QSqlTableModel::OnManualSubmit); model->setTable("books"); - // Remember the indexes of the columns: authorIdx = model->fieldIndex("author"); genreIdx = model->fieldIndex("genre"); - // Set the relations to the other database tables: + // Set the relations to the other database tables model->setRelation(authorIdx, QSqlRelation("authors", "id", "name")); model->setRelation(genreIdx, QSqlRelation("genres", "id", "name")); - // Set the localized header captions: + // Set the localised header captions model->setHeaderData(authorIdx, Qt::Horizontal, tr("Author Name")); model->setHeaderData(genreIdx, Qt::Horizontal, tr("Genre")); model->setHeaderData(model->fieldIndex("title"), @@ -93,56 +122,81 @@ BookWindow::BookWindow() model->setHeaderData(model->fieldIndex("year"), Qt::Horizontal, tr("Year")); model->setHeaderData(model->fieldIndex("rating"), Qt::Horizontal, tr("Rating")); +} - // Populate the model: - if (!model->select()) { - showError(model->lastError()); - return; +void BookWindow::configureWidgets() +{ + tableView->setModel(model); + tableView->setItemDelegate(new BookDelegate(tableView)); + tableView->setColumnHidden(model->fieldIndex("id"), true); + tableView->verticalHeader()->setVisible(false); + tableView->setSelectionMode(QAbstractItemView::ExtendedSelection); + tableView->setSelectionBehavior(QAbstractItemView::SelectRows); + + // Lock and prohibit resizing of the width of the columns + tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); + tableView->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); + tableView->horizontalHeader()->setFixedHeight(tableView->rowHeight(0)); + + // increment by two to consider the frame + tableView->setFixedWidth(tableView->horizontalHeader()->length() + + tableView->verticalScrollBar()->sizeHint().width() + 2); + tableView->setMaximumHeight(tableView->verticalHeader()->length() + + tableView->horizontalHeader()->height() + 2); + + authorComboBox->setModel(model->relationModel(authorIdx)); + authorComboBox->setModelColumn(model->relationModel(authorIdx)->fieldIndex("name")); + + genreComboBox->setModel(model->relationModel(genreIdx)); + genreComboBox->setModelColumn(model->relationModel(genreIdx)->fieldIndex("name")); + + yearSpinBox->setMaximum(9999); + + const int width = 16; + const int height = width; + const int y = 2; + const int padding = 2; + + QSize iconSize = QSize(width * 5 + padding * 2, width + padding * 2); + QIcon starIcon(QStringLiteral(":images/star.svg")); + QIcon starFilledIcon(QStringLiteral(":images/star-filled.svg")); + + for (int row = 0; row < 6; ++row) { + QPixmap icon(iconSize); + icon.fill(Qt::transparent); + QPainter painter(&icon); + int x = 2; + + for (int col = 0; col < 5; ++col) { + if (col < row) { + starFilledIcon.paint(&painter, QRect(x, y, width, height)); + } else { + starIcon.paint(&painter, QRect(x, y, width, height)); + } + x += width; + } + ratingComboBox->addItem(icon, ""); + ratingComboBox->setItemData(row, QString::number(row + 1)); } - // Set the model and hide the ID column: - ui.bookTable->setModel(model); - ui.bookTable->setItemDelegate(new BookDelegate(ui.bookTable)); - ui.bookTable->setColumnHidden(model->fieldIndex("id"), true); - ui.bookTable->setSelectionMode(QAbstractItemView::SingleSelection); - - // Initialize the Author combo box: - ui.authorEdit->setModel(model->relationModel(authorIdx)); - ui.authorEdit->setModelColumn( - model->relationModel(authorIdx)->fieldIndex("name")); - - ui.genreEdit->setModel(model->relationModel(genreIdx)); - ui.genreEdit->setModelColumn( - model->relationModel(genreIdx)->fieldIndex("name")); - - // Lock and prohibit resizing of the width of the rating column: - ui.bookTable->horizontalHeader()->setSectionResizeMode( - model->fieldIndex("rating"), - QHeaderView::ResizeToContents); + ratingComboBox->setIconSize(iconSize); +} +void BookWindow::createMappings() +{ QDataWidgetMapper *mapper = new QDataWidgetMapper(this); mapper->setModel(model); mapper->setItemDelegate(new BookDelegate(this)); - mapper->addMapping(ui.titleEdit, model->fieldIndex("title")); - mapper->addMapping(ui.yearEdit, model->fieldIndex("year")); - mapper->addMapping(ui.authorEdit, authorIdx); - mapper->addMapping(ui.genreEdit, genreIdx); - mapper->addMapping(ui.ratingEdit, model->fieldIndex("rating")); - - connect(ui.bookTable->selectionModel(), + mapper->addMapping(titleLineEdit, model->fieldIndex("title")); + mapper->addMapping(yearSpinBox, model->fieldIndex("year")); + mapper->addMapping(authorComboBox, authorIdx); + mapper->addMapping(genreComboBox, genreIdx); + mapper->addMapping(ratingComboBox, model->fieldIndex("rating"), "currentIndex"); + connect(tableView->selectionModel(), &QItemSelectionModel::currentRowChanged, mapper, &QDataWidgetMapper::setCurrentModelIndex ); - - ui.bookTable->setCurrentIndex(model->index(0, 0)); - createMenuBar(); -} - -void BookWindow::showError(const QSqlError &err) -{ - QMessageBox::critical(this, "Unable to initialize Database", - "Error initializing database: " + err.text()); } void BookWindow::createMenuBar() @@ -158,7 +212,7 @@ void BookWindow::createMenuBar() helpMenu->addAction(aboutAction); helpMenu->addAction(aboutQtAction); - connect(quitAction, &QAction::triggered, this, &BookWindow::close); + connect(quitAction, &QAction::triggered, qApp, &QCoreApplication::quit); connect(aboutAction, &QAction::triggered, this, &BookWindow::about); connect(aboutQtAction, &QAction::triggered, qApp, &QApplication::aboutQt); } diff --git a/examples/sql/books/bookwindow.h b/examples/sql/books/bookwindow.h index ec6b935242..46d3570df1 100644 --- a/examples/sql/books/bookwindow.h +++ b/examples/sql/books/bookwindow.h @@ -1,61 +1,18 @@ -/**************************************************************************** -** -** 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 #ifndef BOOKWINDOW_H #define BOOKWINDOW_H -#include <QtWidgets> -#include <QtSql> - -#include "ui_bookwindow.h" - +#include <QMainWindow> +QT_FORWARD_DECLARE_CLASS(QComboBox) +QT_FORWARD_DECLARE_CLASS(QGridLayout) +QT_FORWARD_DECLARE_CLASS(QLabel) +QT_FORWARD_DECLARE_CLASS(QLineEdit) +QT_FORWARD_DECLARE_CLASS(QSpinBox) +QT_FORWARD_DECLARE_CLASS(QSqlError) +QT_FORWARD_DECLARE_CLASS(QSqlRelationalTableModel) +QT_FORWARD_DECLARE_CLASS(QTableView) class BookWindow: public QMainWindow { @@ -68,11 +25,29 @@ private slots: private: void showError(const QSqlError &err); - Ui::BookWindow ui; - QSqlRelationalTableModel *model; - int authorIdx, genreIdx; + QSqlRelationalTableModel *model = nullptr; + int authorIdx = 0, genreIdx = 0; + void createLayout(); + void createModel(); + void configureWidgets(); + void createMappings(); void createMenuBar(); + + QWidget *window = nullptr; + + QGridLayout *gridLayout = nullptr; + QTableView *tableView = nullptr; + QLabel *titleLabel = nullptr; + QLineEdit *titleLineEdit = nullptr; + QLabel *authorLabel = nullptr; + QComboBox *authorComboBox = nullptr; + QLabel *genreLabel = nullptr; + QComboBox *genreComboBox = nullptr; + QLabel *yearLabel = nullptr; + QSpinBox *yearSpinBox = nullptr; + QLabel *ratingLabel = nullptr; + QComboBox *ratingComboBox = nullptr; }; #endif diff --git a/examples/sql/books/bookwindow.ui b/examples/sql/books/bookwindow.ui deleted file mode 100644 index ce8f9f933a..0000000000 --- a/examples/sql/books/bookwindow.ui +++ /dev/null @@ -1,164 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>BookWindow</class> - <widget class="QMainWindow" name="BookWindow"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>601</width> - <height>420</height> - </rect> - </property> - <property name="windowTitle"> - <string>Books</string> - </property> - <widget class="QWidget" name="centralWidget"> - <layout class="QVBoxLayout"> - <property name="spacing"> - <number>6</number> - </property> - <property name="leftMargin"> - <number>9</number> - </property> - <property name="topMargin"> - <number>9</number> - </property> - <property name="rightMargin"> - <number>9</number> - </property> - <property name="bottomMargin"> - <number>9</number> - </property> - <item> - <widget class="QGroupBox" name="groupBox"> - <property name="title"> - <string/> - </property> - <layout class="QVBoxLayout"> - <property name="spacing"> - <number>6</number> - </property> - <property name="leftMargin"> - <number>9</number> - </property> - <property name="topMargin"> - <number>9</number> - </property> - <property name="rightMargin"> - <number>9</number> - </property> - <property name="bottomMargin"> - <number>9</number> - </property> - <item> - <widget class="QTableView" name="bookTable"> - <property name="selectionBehavior"> - <enum>QAbstractItemView::SelectRows</enum> - </property> - </widget> - </item> - <item> - <widget class="QGroupBox" name="groupBox_2"> - <property name="title"> - <string>Details</string> - </property> - <layout class="QFormLayout"> - <item row="0" column="0"> - <widget class="QLabel" name="label_5"> - <property name="text"> - <string><b>Title:</b></string> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QLineEdit" name="titleEdit"> - <property name="enabled"> - <bool>true</bool> - </property> - </widget> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="label_2"> - <property name="text"> - <string><b>Author: </b></string> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QComboBox" name="authorEdit"> - <property name="enabled"> - <bool>true</bool> - </property> - </widget> - </item> - <item row="2" column="0"> - <widget class="QLabel" name="label_3"> - <property name="text"> - <string><b>Genre:</b></string> - </property> - </widget> - </item> - <item row="2" column="1"> - <widget class="QComboBox" name="genreEdit"> - <property name="enabled"> - <bool>true</bool> - </property> - </widget> - </item> - <item row="3" column="0"> - <widget class="QLabel" name="label_4"> - <property name="text"> - <string><b>Year:</b></string> - </property> - </widget> - </item> - <item row="3" column="1"> - <widget class="QSpinBox" name="yearEdit"> - <property name="enabled"> - <bool>true</bool> - </property> - <property name="prefix"> - <string/> - </property> - <property name="minimum"> - <number>-1000</number> - </property> - <property name="maximum"> - <number>2100</number> - </property> - </widget> - </item> - <item row="4" column="0"> - <widget class="QLabel" name="label"> - <property name="text"> - <string><b>Rating:</b></string> - </property> - </widget> - </item> - <item row="4" column="1"> - <widget class="QSpinBox" name="ratingEdit"> - <property name="maximum"> - <number>5</number> - </property> - </widget> - </item> - </layout> - </widget> - </item> - </layout> - </widget> - </item> - </layout> - </widget> - </widget> - <tabstops> - <tabstop>bookTable</tabstop> - <tabstop>titleEdit</tabstop> - <tabstop>authorEdit</tabstop> - <tabstop>genreEdit</tabstop> - <tabstop>yearEdit</tabstop> - </tabstops> - <resources/> - <connections/> -</ui> diff --git a/examples/sql/books/images/star-filled.svg b/examples/sql/books/images/star-filled.svg new file mode 100644 index 0000000000..8a2aee27fb --- /dev/null +++ b/examples/sql/books/images/star-filled.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="#0d0d0d"><path d="M8.41 18.138L12 15.845l3.59 2.323-.94-4.345 3.162-2.897-4.159-.392L12 6.43l-1.652 4.073-4.159.392 3.162 2.927-.94 4.315zm-1.346 3.696a1.04 1.04 0 0 1-1.567-1.104l1.318-6.033-4.476-4.11c-.665-.611-.293-1.726.604-1.808l5.866-.539 2.229-5.587c.348-.872 1.575-.872 1.923 0l2.229 5.587 5.866.539c.897.082 1.269 1.197.604 1.808l-4.476 4.11 1.318 6.033a1.04 1.04 0 0 1-1.567 1.104L12 18.681l-4.935 3.153z"/><path d="M12 5l-1.796 5.528H4.392l4.702 3.416-1.796 5.528L12 16.056l4.702 3.416-1.796-5.528 4.702-3.416h-5.812L12 5z"/></svg> diff --git a/examples/sql/books/images/star.png b/examples/sql/books/images/star.png Binary files differdeleted file mode 100644 index 87f4464bd5..0000000000 --- a/examples/sql/books/images/star.png +++ /dev/null diff --git a/examples/sql/books/images/star.svg b/examples/sql/books/images/star.svg new file mode 100644 index 0000000000..d959abc182 --- /dev/null +++ b/examples/sql/books/images/star.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none"><path d="M8.41 18.138L12 15.845l3.59 2.323-.94-4.345 3.162-2.897-4.159-.392L12 6.43l-1.652 4.073-4.159.392 3.162 2.927-.94 4.315zm-1.346 3.696a1.04 1.04 0 0 1-1.567-1.104l1.318-6.033-4.476-4.11c-.665-.611-.293-1.726.604-1.808l5.866-.539 2.229-5.587c.348-.872 1.575-.872 1.923 0l2.229 5.587 5.866.539c.897.082 1.269 1.197.604 1.808l-4.476 4.11 1.318 6.033a1.04 1.04 0 0 1-1.567 1.104L12 18.681l-4.935 3.153z" fill="#0d0d0d"/></svg> diff --git a/examples/sql/books/initdb.h b/examples/sql/books/initdb.h index e1f690a234..9de8845a2f 100644 --- a/examples/sql/books/initdb.h +++ b/examples/sql/books/initdb.h @@ -1,57 +1,12 @@ -/**************************************************************************** -** -** Copyright (C) 2020 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) 2020 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #ifndef INITDB_H #define INITDB_H -#include <QtSql> +#include <QDate> +#include <QSqlError> +#include <QSqlQuery> void addBook(QSqlQuery &q, const QString &title, int year, const QVariant &authorId, const QVariant &genreId, int rating) diff --git a/examples/sql/books/main.cpp b/examples/sql/books/main.cpp index 7cf6fdd138..76a05f1c39 100644 --- a/examples/sql/books/main.cpp +++ b/examples/sql/books/main.cpp @@ -1,61 +1,12 @@ -/**************************************************************************** -** -** 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 "bookwindow.h" -#include <QtWidgets> +#include <QApplication> int main(int argc, char * argv[]) { - Q_INIT_RESOURCE(books); - QApplication app(argc, argv); BookWindow win; |