Qt 4.0: mainwindow.cpp Example File (richtext/orderform/mainwindow.cpp)

|  | Home · All Classes · Main Classes · Grouped Classes · Modules · Functions |

# mainwindow.cpp Example File
richtext/orderform/mainwindow.cpp

        /****************************************************************************
        **
        ** Copyright (C) 2005-2005 Trolltech AS. All rights reserved.
        **
        ** This file is part of the documentation of the Qt Toolkit.
        **
        ** This file may be used under the terms of the GNU General Public
    ** License version 2.0 as published by the Free Software Foundation
    ** and appearing in the file LICENSE.GPL included in the packaging of
    ** this file.  Please review the following information to ensure GNU
    ** General Public Licensing requirements will be met:
    ** http://www.trolltech.com/products/qt/opensource.html
    **
    ** If you are unsure which license is appropriate for your use, please
    ** review the following information:
    ** http://www.trolltech.com/products/qt/licensing.html or contact the
    ** sales department at sales@trolltech.com.
        **
        ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
        ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        **
        ****************************************************************************/

        #include <QtGui>

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

        MainWindow::MainWindow()
        {
            QMenu *fileMenu = new QMenu(tr("&File"), this);
            QAction *newAction = fileMenu->addAction(tr("&New..."));
            newAction->setShortcut(tr("Ctrl+N"));
            printAction = fileMenu->addAction(tr("&Print..."), this, SLOT(printFile()));
            printAction->setShortcut(tr("Ctrl+P"));
            printAction->setEnabled(false);
            QAction *quitAction = fileMenu->addAction(tr("E&xit"));
            quitAction->setShortcut(tr("Ctrl+Q"));
            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();

            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.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()
        {
            QTextEdit *editor = static_cast<QTextEdit*>(letters->currentWidget());
            QTextDocument *document = editor->document();
            QPrinter printer;

            QPrintDialog *dialog = new QPrintDialog(&printer, this);
            if (dialog->exec() != QDialog::Accepted)
                return;

            document->print(&printer);
        }