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

# mainwindow.cpp Example File
demos/mainwindow/mainwindow.cpp

        /****************************************************************************
        **
        ** Copyright (C) 2004-2006 Trolltech ASA. All rights reserved.
        **
        ** This file is part of the demonstration applications of the Qt Toolkit.
        **
        ** Licensees holding valid Qt Preview licenses may use this file in
        ** accordance with the Qt Preview License Agreement provided with the
        ** Software.
        **
        ** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
        ** information about Qt Commercial License Agreements.
        **
        ** Contact info@trolltech.com if any conditions of this licensing are
        ** not clear to you.
        **
        ** 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 "mainwindow.h"
        #include "colorswatch.h"
        #include "toolbar.h"

        #include <QAction>
        #include <QLayout>
        #include <QMenu>
        #include <QMenuBar>
        #include <QStatusBar>
        #include <QTextEdit>
        #include <QFile>
        #include <QDataStream>
        #include <QFileDialog>
        #include <QMessageBoxEx>
        #include <QSignalMapper>
        #include <qdebug.h>

        static const char * const message =
            "<p><b>Qt Main Window Demo</b></p>"

            "<p>This is a demonstration of the QMainWindow, QToolBar and "
            "QDockWidget classes.</p>"

            "<p>The tool bar and dock widgets can be dragged around and rearranged "
            "using the mouse or via the menu.</p>"

            "<p>Each dock widget contains a colored frame and a context "
            "(right-click) menu.</p>"

        #ifdef Q_WS_MAC
            "<p>On Mac OS X, the \"Black\" dock widget has been created as a "
            "<em>Drawer</em>, which is a special kind of QDockWidget.</p>"
        #endif
            ;

        MainWindow::MainWindow(QWidget *parent, Qt::WindowFlags flags)
            : QMainWindow(parent, flags)
        {
            setObjectName("MainWindow");
            setWindowTitle("Qt Main Window Demo");

            setupToolBar();
            setupMenuBar();
            setupDockWidgets();

            QTextEdit *center = new QTextEdit(this);
            center->setReadOnly(true);
            center->setHtml(tr(message));
            center->setMinimumSize(400, 205);
            setCentralWidget(center);

            statusBar()->showMessage(tr("Status Bar"));
        }

        void MainWindow::actionTriggered(QAction *action)
        {
            qDebug("action '%s' triggered", action->text().toLocal8Bit().data());
        }

        void MainWindow::setupToolBar()
        {
            toolbar = new ToolBar(this);
            toolbar->setAllowedAreas(Qt::TopToolBarArea | Qt::BottomToolBarArea);
            addToolBar(toolbar);
        }

        void MainWindow::setupMenuBar()
        {
            QMenu *menu = menuBar()->addMenu(tr("&File"));

            QAction *action = menu->addAction(tr("Save layout..."));
            connect(action, SIGNAL(triggered()), this, SLOT(saveLayout()));

            action = menu->addAction(tr("Load layout..."));
            connect(action, SIGNAL(triggered()), this, SLOT(loadLayout()));

            menu->addSeparator();

            menu->addAction(tr("&Quit"), this, SLOT(close()));

            menuBar()->addMenu(toolbar->menu);
            dockWidgetMenu = menuBar()->addMenu(tr("&Dock Widgets"));
        }

        static void dump(const QByteArray &array)
        {
            QString s;
            for (int i = 0; i < array.count(); ++i) {
                s += ' ';
                s += QString::number((uchar)array.at(i));
            }
            qDebug() << "dump():" << s;
        }

        void MainWindow::saveLayout()
        {
            QString fileName
                = QFileDialog::getSaveFileName(this, tr("Save layout"));
            if (fileName.isEmpty())
                return;
            QFile file(fileName);
            if (!file.open(QFile::WriteOnly)) {
                QString msg = tr("Failed to open %1\n%2")
                                .arg(fileName)
                                .arg(file.errorString());
                QMessageBoxEx::warning(this, tr("Error"), msg);
                return;
            }

            QByteArray geo_data = saveGeometry();
            QByteArray layout_data = saveState();

            bool ok = file.putChar((uchar)geo_data.size());
            if (ok)
                ok = file.write(geo_data) == geo_data.size();
            if (ok)
                ok = file.write(layout_data) == layout_data.size();

            if (!ok) {
                QString msg = tr("Error writing to %1\n%2")
                                .arg(fileName)
                                .arg(file.errorString());
                QMessageBoxEx::warning(this, tr("Error"), msg);
                return;
            }
        }

        void MainWindow::loadLayout()
        {
            QString fileName
                = QFileDialog::getOpenFileName(this, tr("Load layout"));
            if (fileName.isEmpty())
                return;
            QFile file(fileName);
            if (!file.open(QFile::ReadOnly)) {
                QString msg = tr("Failed to open %1\n%2")
                                .arg(fileName)
                                .arg(file.errorString());
                QMessageBoxEx::warning(this, tr("Error"), msg);
                return;
            }

            uchar geo_size;
            QByteArray geo_data;
            QByteArray layout_data;

            bool ok = file.getChar((char*)&geo_size);
            if (ok) {
                geo_data = file.read(geo_size);
                ok = geo_data.size() == geo_size;
            }
            if (ok) {
                layout_data = file.readAll();
                ok = layout_data.size() > 0;
            }

            if (ok)
                ok = restoreGeometry(geo_data);
            if (ok)
                ok = restoreState(layout_data);

            if (!ok) {
                QString msg = tr("Error reading %1")
                                .arg(fileName);
                QMessageBoxEx::warning(this, tr("Error"), msg);
                return;
            }
        }

        QAction *addAction(QMenu *menu, const QString &text, QActionGroup *group, QSignalMapper *mapper,
                            int id)
        {
            bool first = group->actions().isEmpty();
            QAction *result = menu->addAction(text);
            result->setCheckable(true);
            result->setChecked(first);
            group->addAction(result);
            QObject::connect(result, SIGNAL(triggered()), mapper, SLOT(map()));
            mapper->setMapping(result, id);
            return result;
        }

        void MainWindow::setupDockWidgets()
        {
            QAction *action = dockWidgetMenu->addAction(tr("Animation"));
            action->setCheckable(true);
            action->setChecked(isAnimationEnabled());
            connect(action, SIGNAL(toggled(bool)), this, SLOT(setAnimationEnabled(bool)));

            action = dockWidgetMenu->addAction(tr("Nesting"));
            action->setCheckable(true);
            action->setChecked(isDockNestingEnabled());
            connect(action, SIGNAL(toggled(bool)), this, SLOT(setDockNestingEnabled(bool)));

            dockWidgetMenu->addSeparator();

            mapper = new QSignalMapper(this);
            connect(mapper, SIGNAL(mapped(int)), this, SLOT(setCorner(int)));

            QMenu *corner_menu = dockWidgetMenu->addMenu(tr("Top left corner"));
            QActionGroup *group = new QActionGroup(this);
            group->setExclusive(true);
            ::addAction(corner_menu, tr("Top dock area"), group, mapper, 0);
            ::addAction(corner_menu, tr("Left dock area"), group, mapper, 1);

            corner_menu = dockWidgetMenu->addMenu(tr("Top right corner"));
            group = new QActionGroup(this);
            group->setExclusive(true);
            ::addAction(corner_menu, tr("Top dock area"), group, mapper, 2);
            ::addAction(corner_menu, tr("Right dock area"), group, mapper, 3);

            corner_menu = dockWidgetMenu->addMenu(tr("Bottom left corner"));
            group = new QActionGroup(this);
            group->setExclusive(true);
            ::addAction(corner_menu, tr("Bottom dock area"), group, mapper, 4);
            ::addAction(corner_menu, tr("Left dock area"), group, mapper, 5);

            corner_menu = dockWidgetMenu->addMenu(tr("Bottom right corner"));
            group = new QActionGroup(this);
            group->setExclusive(true);
            ::addAction(corner_menu, tr("Bottom dock area"), group, mapper, 6);
            ::addAction(corner_menu, tr("Right dock area"), group, mapper, 7);

            dockWidgetMenu->addSeparator();

            static const struct Set {
                const char * name;
                uint flags;
                Qt::DockWidgetArea area;
            } sets [] = {
        #ifndef Q_WS_MAC
                { "Black", 0, Qt::LeftDockWidgetArea },
        #else
                { "Black", Qt::Drawer, Qt::LeftDockWidgetArea },
        #endif
                { "White", 0, Qt::LeftDockWidgetArea },
                { "LightGrey", 0, Qt::RightDockWidgetArea },
                { "DarkGrey", 0, Qt::RightDockWidgetArea },
                { "Red", 0, Qt::TopDockWidgetArea },
                { "Green", 0, Qt::TopDockWidgetArea },
                { "Blue", 0, Qt::BottomDockWidgetArea },
                { "Yellow", 0, Qt::BottomDockWidgetArea }
            };
            const int setCount = sizeof(sets) / sizeof(Set);

            for (int i = 0; i < setCount; ++i) {
                ColorSwatch *swatch = new ColorSwatch(tr(sets[i].name), this, Qt::WindowFlags(sets[i].flags));
                if (i%2)
                    swatch->setWindowIcon(QIcon(QPixmap(":/res/qt.png")));
                addDockWidget(sets[i].area, swatch);
                dockWidgetMenu->addMenu(swatch->menu);
            }
        }

        void MainWindow::setCorner(int id)
        {
            switch (id) {
                case 0:
                    QMainWindow::setCorner(Qt::TopLeftCorner, Qt::TopDockWidgetArea);
                    break;
                case 1:
                    QMainWindow::setCorner(Qt::TopLeftCorner, Qt::LeftDockWidgetArea);
                    break;
                case 2:
                    QMainWindow::setCorner(Qt::TopRightCorner, Qt::TopDockWidgetArea);
                    break;
                case 3:
                    QMainWindow::setCorner(Qt::TopRightCorner, Qt::RightDockWidgetArea);
                    break;
                case 4:
                    QMainWindow::setCorner(Qt::BottomLeftCorner, Qt::BottomDockWidgetArea);
                    break;
                case 5:
                    QMainWindow::setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea);
                    break;
                case 6:
                    QMainWindow::setCorner(Qt::BottomRightCorner, Qt::BottomDockWidgetArea);
                    break;
                case 7:
                    QMainWindow::setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea);
                    break;
            }
        }