Qt 5.6 | Qt Widgets | Order Form Example | mainwindow.cpp Example File

Qt 5.6.2 Reference Documentation

# mainwindow.cpp Example File

richtext/orderform/mainwindow.cpp

      /****************************************************************************
      **
      ** Copyright (C) 2015 The Qt Company Ltd.
      ** Contact: http://www.qt.io/licensing/
      **
      ** This file is part of the examples of the Qt Toolkit.
      **
      ** $QT_BEGIN_LICENSE:BSD$
      ** 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 <QtWidgets>
      #ifndef QT_NO_PRINTER
      #include <QPrinter>
      #include <QPrintDialog>
      #endif

      #include "detailsdialog.h"
      #include "mainwindow.h"

      MainWindow::MainWindow()
      {
          QMenu *fileMenu = new QMenu(tr("&File"), this);
          QAction *newAction = fileMenu->addAction(tr("&New..."));
          newAction->setShortcuts(QKeySequence::New);
          printAction = fileMenu->addAction(tr("&Print..."), this, SLOT(printFile()));
          printAction->setShortcuts(QKeySequence::Print);
          printAction->setEnabled(false);
          QAction *quitAction = fileMenu->addAction(tr("E&xit"));
          quitAction->setShortcuts(QKeySequence::Quit);
          menuBar()->addMenu(fileMenu);

          letters = new QTabWidget;

          connect(newAction, SIGNAL(triggered()), this, SLOT(openDialog()));
          connect(quitAction, SIGNAL(triggered()), this, SLOT(close()));

          setCentralWidget(letters);
          setWindowTitle(tr("Order Form"));
      }

      void MainWindow::createLetter(const QString &name, const QString &address,
                                    QList<QPair<QString,int> > orderItems,
                                    bool sendOffers)
      {
          QTextEdit *editor = new QTextEdit;
          int tabIndex = letters->addTab(editor, name);
          letters->setCurrentIndex(tabIndex);

          QTextCursor cursor(editor->textCursor());
          cursor.movePosition(QTextCursor::Start);
          QTextFrame *topFrame = cursor.currentFrame();
          QTextFrameFormat topFrameFormat = topFrame->frameFormat();
          topFrameFormat.setPadding(16);
          topFrame->setFrameFormat(topFrameFormat);

          QTextCharFormat textFormat;
          QTextCharFormat boldFormat;
          boldFormat.setFontWeight(QFont::Bold);

          QTextFrameFormat referenceFrameFormat;
          referenceFrameFormat.setBorder(1);
          referenceFrameFormat.setPadding(8);
          referenceFrameFormat.setPosition(QTextFrameFormat::FloatRight);
          referenceFrameFormat.setWidth(QTextLength(QTextLength::PercentageLength, 40));
          cursor.insertFrame(referenceFrameFormat);

          cursor.insertText("A company", boldFormat);
          cursor.insertBlock();
          cursor.insertText("321 City Street");
          cursor.insertBlock();
          cursor.insertText("Industry Park");
          cursor.insertBlock();
          cursor.insertText("Another country");

          cursor.setPosition(topFrame->lastPosition());

          cursor.insertText(name, textFormat);
          QString line;
          foreach (line, address.split("\n")) {
              cursor.insertBlock();
              cursor.insertText(line);
          }
          cursor.insertBlock();
          cursor.insertBlock();

          QDate date = QDate::currentDate();
          cursor.insertText(tr("Date: %1").arg(date.toString("d MMMM yyyy")),
                            textFormat);
          cursor.insertBlock();

          QTextFrameFormat bodyFrameFormat;
          bodyFrameFormat.setWidth(QTextLength(QTextLength::PercentageLength, 100));
          cursor.insertFrame(bodyFrameFormat);

          cursor.insertText(tr("I would like to place an order for the following "
                               "items:"), textFormat);
          cursor.insertBlock();
          cursor.insertBlock();

          QTextTableFormat orderTableFormat;
          orderTableFormat.setAlignment(Qt::AlignHCenter);
          QTextTable *orderTable = cursor.insertTable(1, 2, orderTableFormat);

          QTextFrameFormat orderFrameFormat = cursor.currentFrame()->frameFormat();
          orderFrameFormat.setBorder(1);
          cursor.currentFrame()->setFrameFormat(orderFrameFormat);

          cursor = orderTable->cellAt(0, 0).firstCursorPosition();
          cursor.insertText(tr("Product"), boldFormat);
          cursor = orderTable->cellAt(0, 1).firstCursorPosition();
          cursor.insertText(tr("Quantity"), boldFormat);

          for (int i = 0; i < orderItems.count(); ++i) {
              QPair<QString,int> item = orderItems[i];
              int row = orderTable->rows();

              orderTable->insertRows(row, 1);
              cursor = orderTable->cellAt(row, 0).firstCursorPosition();
              cursor.insertText(item.first, textFormat);
              cursor = orderTable->cellAt(row, 1).firstCursorPosition();
              cursor.insertText(QString("%1").arg(item.second), textFormat);
          }

          cursor.setPosition(topFrame->lastPosition());

          cursor.insertBlock();
          cursor.insertText(tr("Please update my records to take account of the "
                               "following privacy information:"));
          cursor.insertBlock();

          QTextTable *offersTable = cursor.insertTable(2, 2);

          cursor = offersTable->cellAt(0, 1).firstCursorPosition();
          cursor.insertText(tr("I want to receive more information about your "
                               "company's products and special offers."), textFormat);
          cursor = offersTable->cellAt(1, 1).firstCursorPosition();
          cursor.insertText(tr("I do not want to receive any promotional information "
                               "from your company."), textFormat);

          if (sendOffers)
              cursor = offersTable->cellAt(0, 0).firstCursorPosition();
          else
              cursor = offersTable->cellAt(1, 0).firstCursorPosition();

          cursor.insertText("X", boldFormat);

          cursor.setPosition(topFrame->lastPosition());
          cursor.insertBlock();
          cursor.insertText(tr("Sincerely,"), textFormat);
          cursor.insertBlock();
          cursor.insertBlock();
          cursor.insertBlock();
          cursor.insertText(name);

          printAction->setEnabled(true);
      }

      void MainWindow::createSample()
      {
          DetailsDialog dialog("Dialog with default values", this);
          createLetter("Mr. Smith", "12 High Street\nSmall Town\nThis country",
                       dialog.orderItems(), true);
      }

      void MainWindow::openDialog()
      {
          DetailsDialog dialog(tr("Enter Customer Details"), this);

          if (dialog.exec() == QDialog::Accepted) {
              createLetter(dialog.senderName(), dialog.senderAddress(),
                           dialog.orderItems(), dialog.sendOffers());
          }
      }

      void MainWindow::printFile()
      {
      #if !defined(QT_NO_PRINTER) && !defined(QT_NO_PRINTDIALOG)
          QTextEdit *editor = static_cast<QTextEdit*>(letters->currentWidget());
          QPrinter printer;

          QPrintDialog dialog(&printer, this);
          dialog.setWindowTitle(tr("Print Document"));
          if (editor->textCursor().hasSelection())
              dialog.addEnabledOption(QAbstractPrintDialog::PrintSelection);
          if (dialog.exec() != QDialog::Accepted) {
              return;
          }

          editor->print(&printer);
      #endif
      }