Qt 5.6 | Qt Widgets | Dock Widgets Example | mainwindow.cpp Example File

Qt 5.6.2 Reference Documentation

# mainwindow.cpp Example File

mainwindows/dockwidgets/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_PRINTDIALOG
      #include <QtPrintSupport>
      #endif

      #include "mainwindow.h"

      MainWindow::MainWindow()
          : textEdit(new QTextEdit)
      {
          setCentralWidget(textEdit);

          createActions();
          createStatusBar();
          createDockWindows();

          setWindowTitle(tr("Dock Widgets"));

          newLetter();
          setUnifiedTitleAndToolBarOnMac(true);
      }

      void MainWindow::newLetter()
      {
          textEdit->clear();

          QTextCursor cursor(textEdit->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);
          QTextCharFormat italicFormat;
          italicFormat.setFontItalic(true);

          QTextTableFormat tableFormat;
          tableFormat.setBorder(1);
          tableFormat.setCellPadding(16);
          tableFormat.setAlignment(Qt::AlignRight);
          cursor.insertTable(1, 1, tableFormat);
          cursor.insertText("The Firm", boldFormat);
          cursor.insertBlock();
          cursor.insertText("321 City Street", textFormat);
          cursor.insertBlock();
          cursor.insertText("Industry Park");
          cursor.insertBlock();
          cursor.insertText("Some Country");
          cursor.setPosition(topFrame->lastPosition());
          cursor.insertText(QDate::currentDate().toString("d MMMM yyyy"), textFormat);
          cursor.insertBlock();
          cursor.insertBlock();
          cursor.insertText("Dear ", textFormat);
          cursor.insertText("NAME", italicFormat);
          cursor.insertText(",", textFormat);
          for (int i = 0; i < 3; ++i)
              cursor.insertBlock();
          cursor.insertText(tr("Yours sincerely,"), textFormat);
          for (int i = 0; i < 3; ++i)
              cursor.insertBlock();
          cursor.insertText("The Boss", textFormat);
          cursor.insertBlock();
          cursor.insertText("ADDRESS", italicFormat);
      }

      void MainWindow::print()
      {
      #ifndef QT_NO_PRINTDIALOG
          QTextDocument *document = textEdit->document();
          QPrinter printer;

          QPrintDialog dlg(&printer, this);
          if (dlg.exec() != QDialog::Accepted) {
              return;
          }

          document->print(&printer);
          statusBar()->showMessage(tr("Ready"), 2000);
      #endif
      }

      void MainWindow::save()
      {
          QMimeDatabase mimeDatabase;
          QString fileName = QFileDialog::getSaveFileName(this,
                              tr("Choose a file name"), ".",
                              mimeDatabase.mimeTypeForName("text/html").filterString());
          if (fileName.isEmpty())
              return;
          QFile file(fileName);
          if (!file.open(QFile::WriteOnly | QFile::Text)) {
              QMessageBox::warning(this, tr("Dock Widgets"),
                                   tr("Cannot write file %1:\n%2.")
                                   .arg(QDir::toNativeSeparators(fileName), file.errorString()));
              return;
          }

          QTextStream out(&file);
          QApplication::setOverrideCursor(Qt::WaitCursor);
          out << textEdit->toHtml();
          QApplication::restoreOverrideCursor();

          statusBar()->showMessage(tr("Saved '%1'").arg(fileName), 2000);
      }

      void MainWindow::undo()
      {
          QTextDocument *document = textEdit->document();
          document->undo();
      }

      void MainWindow::insertCustomer(const QString &customer)
      {
          if (customer.isEmpty())
              return;
          QStringList customerList = customer.split(", ");
          QTextDocument *document = textEdit->document();
          QTextCursor cursor = document->find("NAME");
          if (!cursor.isNull()) {
              cursor.beginEditBlock();
              cursor.insertText(customerList.at(0));
              QTextCursor oldcursor = cursor;
              cursor = document->find("ADDRESS");
              if (!cursor.isNull()) {
                  for (int i = 1; i < customerList.size(); ++i) {
                      cursor.insertBlock();
                      cursor.insertText(customerList.at(i));
                  }
                  cursor.endEditBlock();
              }
              else
                  oldcursor.endEditBlock();
          }
      }

      void MainWindow::addParagraph(const QString &paragraph)
      {
          if (paragraph.isEmpty())
              return;
          QTextDocument *document = textEdit->document();
          QTextCursor cursor = document->find(tr("Yours sincerely,"));
          if (cursor.isNull())
              return;
          cursor.beginEditBlock();
          cursor.movePosition(QTextCursor::PreviousBlock, QTextCursor::MoveAnchor, 2);
          cursor.insertBlock();
          cursor.insertText(paragraph);
          cursor.insertBlock();
          cursor.endEditBlock();

      }

      void MainWindow::about()
      {
         QMessageBox::about(this, tr("About Dock Widgets"),
                  tr("The <b>Dock Widgets</b> example demonstrates how to "
                     "use Qt's dock widgets. You can enter your own text, "
                     "click a customer to add a customer name and "
                     "address, and click standard paragraphs to add them."));
      }

      void MainWindow::createActions()
      {
          QMenu *fileMenu = menuBar()->addMenu(tr("&File"));
          QToolBar *fileToolBar = addToolBar(tr("File"));

          const QIcon newIcon = QIcon::fromTheme("document-new", QIcon(":/images/new.png"));
          QAction *newLetterAct = new QAction(newIcon, tr("&New Letter"), this);
          newLetterAct->setShortcuts(QKeySequence::New);
          newLetterAct->setStatusTip(tr("Create a new form letter"));
          connect(newLetterAct, &QAction::triggered, this, &MainWindow::newLetter);
          fileMenu->addAction(newLetterAct);
          fileToolBar->addAction(newLetterAct);

          const QIcon saveIcon = QIcon::fromTheme("document-save", QIcon(":/images/save.png"));
          QAction *saveAct = new QAction(saveIcon, tr("&Save..."), this);
          saveAct->setShortcuts(QKeySequence::Save);
          saveAct->setStatusTip(tr("Save the current form letter"));
          connect(saveAct, &QAction::triggered, this, &MainWindow::save);
          fileMenu->addAction(saveAct);
          fileToolBar->addAction(saveAct);

          const QIcon printIcon = QIcon::fromTheme("document-print", QIcon(":/images/print.png"));
          QAction *printAct = new QAction(printIcon, tr("&Print..."), this);
          printAct->setShortcuts(QKeySequence::Print);
          printAct->setStatusTip(tr("Print the current form letter"));
          connect(printAct, &QAction::triggered, this, &MainWindow::print);
          fileMenu->addAction(printAct);
          fileToolBar->addAction(printAct);

          fileMenu->addSeparator();

          QAction *quitAct = fileMenu->addAction(tr("&Quit"), this, &QWidget::close);
          quitAct->setShortcuts(QKeySequence::Quit);
          quitAct->setStatusTip(tr("Quit the application"));

          QMenu *editMenu = menuBar()->addMenu(tr("&Edit"));
          QToolBar *editToolBar = addToolBar(tr("Edit"));
          const QIcon undoIcon = QIcon::fromTheme("edit-undo", QIcon(":/images/undo.png"));
          QAction *undoAct = new QAction(undoIcon, tr("&Undo"), this);
          undoAct->setShortcuts(QKeySequence::Undo);
          undoAct->setStatusTip(tr("Undo the last editing action"));
          connect(undoAct, &QAction::triggered, this, &MainWindow::undo);
          editMenu->addAction(undoAct);
          editToolBar->addAction(undoAct);

          viewMenu = menuBar()->addMenu(tr("&View"));

          menuBar()->addSeparator();

          QMenu *helpMenu = menuBar()->addMenu(tr("&Help"));

          QAction *aboutAct = helpMenu->addAction(tr("&About"), this, &MainWindow::about);
          aboutAct->setStatusTip(tr("Show the application's About box"));

          QAction *aboutQtAct = helpMenu->addAction(tr("About &Qt"), qApp, &QApplication::aboutQt);
          aboutQtAct->setStatusTip(tr("Show the Qt library's About box"));
      }

      void MainWindow::createStatusBar()
      {
          statusBar()->showMessage(tr("Ready"));
      }

      void MainWindow::createDockWindows()
      {
          QDockWidget *dock = new QDockWidget(tr("Customers"), this);
          dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
          customerList = new QListWidget(dock);
          customerList->addItems(QStringList()
                  << "John Doe, Harmony Enterprises, 12 Lakeside, Ambleton"
                  << "Jane Doe, Memorabilia, 23 Watersedge, Beaton"
                  << "Tammy Shea, Tiblanka, 38 Sea Views, Carlton"
                  << "Tim Sheen, Caraba Gifts, 48 Ocean Way, Deal"
                  << "Sol Harvey, Chicos Coffee, 53 New Springs, Eccleston"
                  << "Sally Hobart, Tiroli Tea, 67 Long River, Fedula");
          dock->setWidget(customerList);
          addDockWidget(Qt::RightDockWidgetArea, dock);
          viewMenu->addAction(dock->toggleViewAction());

          dock = new QDockWidget(tr("Paragraphs"), this);
          paragraphsList = new QListWidget(dock);
          paragraphsList->addItems(QStringList()
                  << "Thank you for your payment which we have received today."
                  << "Your order has been dispatched and should be with you "
                     "within 28 days."
                  << "We have dispatched those items that were in stock. The "
                     "rest of your order will be dispatched once all the "
                     "remaining items have arrived at our warehouse. No "
                     "additional shipping charges will be made."
                  << "You made a small overpayment (less than $5) which we "
                     "will keep on account for you, or return at your request."
                  << "You made a small underpayment (less than $1), but we have "
                     "sent your order anyway. We'll add this underpayment to "
                     "your next bill."
                  << "Unfortunately you did not send enough money. Please remit "
                     "an additional $. Your order will be dispatched as soon as "
                     "the complete amount has been received."
                  << "You made an overpayment (more than $5). Do you wish to "
                     "buy more items, or should we return the excess to you?");
          dock->setWidget(paragraphsList);
          addDockWidget(Qt::RightDockWidgetArea, dock);
          viewMenu->addAction(dock->toggleViewAction());

          connect(customerList, &QListWidget::currentTextChanged,
                  this, &MainWindow::insertCustomer);
          connect(paragraphsList, &QListWidget::currentTextChanged,
                  this, &MainWindow::addParagraph);
      }