Qt 5.9 | Qt SQL | Drill Down Example | informationwindow.cpp Example File

Qt 5.9.9 Reference Documentation

# informationwindow.cpp Example File

drilldown/informationwindow.cpp

      /****************************************************************************
      **
      ** Copyright (C) 2016 The Qt Company Ltd.
      ** Contact: https://www.qt.io/licensing/
      **
      ** This file is part of the examples 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$
      **
      ****************************************************************************/

      #include "informationwindow.h"

      InformationWindow::InformationWindow(int id, QSqlRelationalTableModel *items,
                                           QWidget *parent)
          : QDialog(parent)
      {
          QLabel *itemLabel = new QLabel(tr("Item: "));
          QLabel *descriptionLabel = new QLabel(tr("Description: "));
          QLabel *imageFileLabel = new QLabel(tr("Image file: "));

          createButtons();

          itemText = new QLabel;
          descriptionEditor = new QTextEdit;

          imageFileEditor = new QComboBox;
          imageFileEditor->setModel(items->relationModel(1));
          imageFileEditor->setModelColumn(items->relationModel(1)->fieldIndex("file"));

          mapper = new QDataWidgetMapper(this);
          mapper->setModel(items);
          mapper->setSubmitPolicy(QDataWidgetMapper::ManualSubmit);
          mapper->setItemDelegate(new QSqlRelationalDelegate(mapper));
          mapper->addMapping(imageFileEditor, 1);
          mapper->addMapping(itemText, 2, "text");
          mapper->addMapping(descriptionEditor, 3);
          mapper->setCurrentIndex(id);

          connect(descriptionEditor, &QTextEdit::textChanged, [=]() {
              enableButtons();
          });
          connect(imageFileEditor, QOverload<int>::of(&QComboBox::currentIndexChanged), [=]() {
              enableButtons();
          });

          QFormLayout *formLayout = new QFormLayout;
          formLayout->addRow(itemLabel, itemText);
          formLayout->addRow(imageFileLabel, imageFileEditor);
          formLayout->addRow(descriptionLabel, descriptionEditor);

          QVBoxLayout *layout = new QVBoxLayout;
          layout->addLayout(formLayout);
          layout->addWidget(buttonBox);
          setLayout(layout);

          itemId = id;
          displayedImage = imageFileEditor->currentText();

          setWindowFlags(Qt::Window);
          enableButtons(false);
          setWindowTitle(itemText->text());
      }

      int InformationWindow::id() const
      {
          return itemId;
      }

      void InformationWindow::revert()
      {
          mapper->revert();
          enableButtons(false);
      }

      void InformationWindow::submit()
      {
          QString newImage(imageFileEditor->currentText());

          if (displayedImage != newImage) {
              displayedImage = newImage;
              emit imageChanged(itemId, newImage);
          }

          mapper->submit();
          mapper->setCurrentIndex(itemId);

          enableButtons(false);
      }

      void InformationWindow::createButtons()
      {
          closeButton = new QPushButton(tr("&Close"));
          revertButton = new QPushButton(tr("&Revert"));
          submitButton = new QPushButton(tr("&Submit"));

          closeButton->setDefault(true);

          connect(closeButton, &QPushButton::clicked, this, &InformationWindow::close);
          connect(revertButton, &QPushButton::clicked, this, &InformationWindow::revert);
          connect(submitButton, &QPushButton::clicked, this, &InformationWindow::submit);

          buttonBox = new QDialogButtonBox(this);
          buttonBox->addButton(submitButton, QDialogButtonBox::AcceptRole);
          buttonBox->addButton(revertButton, QDialogButtonBox::ResetRole);
          buttonBox->addButton(closeButton, QDialogButtonBox::RejectRole);
      }

      void InformationWindow::enableButtons(bool enable)
      {
          revertButton->setEnabled(enable);
          submitButton->setEnabled(enable);
      }