- Qt 5.5
- Qt Widgets
- Order Form Example
- mainwindow.cpp Example File
- Qt 5.5.1 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
    }