C++/Qt/QMenu

Материал из C\C++ эксперт
Перейти к: навигация, поиск

Adding menu to window

<source lang="cpp"> /****************************************************************************

    • Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
    • All rights reserved.
    • Contact: Nokia Corporation (qt-info@nokia.com)
    • This file is part of the examples of the Qt Toolkit.
    • $QT_BEGIN_LICENSE:LGPL$
    • Commercial Usage
    • Licensees holding valid Qt Commercial licenses may use this file in
    • accordance with the Qt Commercial License Agreement provided with the
    • Software or, alternatively, in accordance with the terms contained in
    • a written agreement between you and Nokia.
    • GNU Lesser General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU Lesser
    • General Public License version 2.1 as published by the Free Software
    • Foundation and appearing in the file LICENSE.LGPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU Lesser General Public License version 2.1 requirements
    • will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
    • In addition, as a special exception, Nokia gives you certain additional
    • rights. These rights are described in the Nokia Qt LGPL Exception
    • version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
    • GNU General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU
    • General Public License version 3.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 the GNU General Public License version 3.0 requirements will be
    • met: http://www.gnu.org/copyleft/gpl.html.
    • If you have questions regarding the use of this file, please contact
    • Nokia at qt-info@nokia.com.
    • $QT_END_LICENSE$
                                                                                                                                                        • /
  1. ifndef MAINWINDOW_H
  2. define MAINWINDOW_H
  3. include <QMainWindow>

QT_BEGIN_NAMESPACE class QAction; class QActionGroup; class QLabel; class QMenu; QT_END_NAMESPACE

class MainWindow : public QMainWindow {

   Q_OBJECT

public:

   MainWindow();

protected:

   void contextMenuEvent(QContextMenuEvent *event);

private slots:

   void newFile();
   void open();
   void save();
   void print();
   void undo();
   void redo();
   void cut();
   void copy();
   void paste();
   void bold();
   void italic();
   void leftAlign();
   void rightAlign();
   void justify();
   void center();
   void setLineSpacing();
   void setParagraphSpacing();
   void about();
   void aboutQt();

private:

   void createActions();
   void createMenus();
   QMenu *fileMenu;
   QMenu *editMenu;
   QMenu *formatMenu;
   QMenu *helpMenu;
   QActionGroup *alignmentGroup;
   QAction *newAct;
   QAction *openAct;
   QAction *saveAct;
   QAction *printAct;
   QAction *exitAct;
   QAction *undoAct;
   QAction *redoAct;
   QAction *cutAct;
   QAction *copyAct;
   QAction *pasteAct;
   QAction *boldAct;
   QAction *italicAct;
   QAction *leftAlignAct;
   QAction *rightAlignAct;
   QAction *justifyAct;
   QAction *centerAct;
   QAction *setLineSpacingAct;
   QAction *setParagraphSpacingAct;
   QAction *aboutAct;
   QAction *aboutQtAct;
   QLabel *infoLabel;

};

  1. endif


  1. include <QtGui>
  2. include "mainwindow.h"

MainWindow::MainWindow() {

   QWidget *widget = new QWidget;
   setCentralWidget(widget);
   QWidget *topFiller = new QWidget;
   topFiller->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
   infoLabel = new QLabel(tr("Choose a menu option, or right-click to "
                             "invoke a context menu"));
   infoLabel->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken);
   infoLabel->setAlignment(Qt::AlignCenter);
   QWidget *bottomFiller = new QWidget;
   bottomFiller->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
   QVBoxLayout *layout = new QVBoxLayout;
   layout->setMargin(5);
   layout->addWidget(topFiller);
   layout->addWidget(infoLabel);
   layout->addWidget(bottomFiller);
   widget->setLayout(layout);
   createActions();
   createMenus();
   QString message = tr("A context menu is available by right-clicking");
   statusBar()->showMessage(message);
   setWindowTitle(tr("Menus"));
   setMinimumSize(160, 160);
   resize(480, 320);

}

void MainWindow::contextMenuEvent(QContextMenuEvent *event) {

   QMenu menu(this);
   menu.addAction(cutAct);
   menu.addAction(copyAct);
   menu.addAction(pasteAct);
   menu.exec(event->globalPos());

}

void MainWindow::newFile() {

   infoLabel->setText(tr("Invoked File|New"));

} void MainWindow::open() {

   infoLabel->setText(tr("Invoked File|Open"));

} void MainWindow::save() {

   infoLabel->setText(tr("Invoked File|Save"));

} void MainWindow::print() {

   infoLabel->setText(tr("Invoked File|Print"));

} void MainWindow::undo() {

   infoLabel->setText(tr("Invoked Edit|Undo"));

} void MainWindow::redo() {

   infoLabel->setText(tr("Invoked Edit|Redo"));

} void MainWindow::cut() {

   infoLabel->setText(tr("Invoked Edit|Cut"));

} void MainWindow::copy() {

   infoLabel->setText(tr("Invoked Edit|Copy"));

} void MainWindow::paste() {

   infoLabel->setText(tr("Invoked Edit|Paste"));

} void MainWindow::bold() {

   infoLabel->setText(tr("Invoked Edit|Format|Bold"));

} void MainWindow::italic() {

   infoLabel->setText(tr("Invoked Edit|Format|Italic"));

} void MainWindow::leftAlign() {

   infoLabel->setText(tr("Invoked Edit|Format|Left Align"));

} void MainWindow::rightAlign() {

   infoLabel->setText(tr("Invoked Edit|Format|Right Align"));

} void MainWindow::justify() {

   infoLabel->setText(tr("Invoked Edit|Format|Justify"));

} void MainWindow::center() {

   infoLabel->setText(tr("Invoked Edit|Format|Center"));

} void MainWindow::setLineSpacing() {

   infoLabel->setText(tr("Invoked Edit|Format|Set Line Spacing"));

} void MainWindow::setParagraphSpacing() {

   infoLabel->setText(tr("Invoked Edit|Format|Set Paragraph Spacing"));

} void MainWindow::about() {

   infoLabel->setText(tr("Invoked Help|About"));
   QMessageBox::about(this, tr("About Menu"),
           tr("The Menu example shows how to create "
              "menu-bar menus and context menus."));

} void MainWindow::aboutQt() {

   infoLabel->setText(tr("Invoked Help|About Qt"));

}

void MainWindow::createActions() {

   newAct = new QAction(tr("&New"), this);
   newAct->setShortcuts(QKeySequence::New);
   newAct->setStatusTip(tr("Create a new file"));
   connect(newAct, SIGNAL(triggered()), this, SLOT(newFile()));
   openAct = new QAction(tr("&Open..."), this);
   openAct->setShortcuts(QKeySequence::Open);
   openAct->setStatusTip(tr("Open an existing file"));
   connect(openAct, SIGNAL(triggered()), this, SLOT(open()));
   saveAct = new QAction(tr("&Save"), this);
   saveAct->setShortcuts(QKeySequence::Save);
   saveAct->setStatusTip(tr("Save the document to disk"));
   connect(saveAct, SIGNAL(triggered()), this, SLOT(save()));
   printAct = new QAction(tr("&Print..."), this);
   printAct->setShortcuts(QKeySequence::Print);
   printAct->setStatusTip(tr("Print the document"));
   connect(printAct, SIGNAL(triggered()), this, SLOT(print()));
   exitAct = new QAction(tr("E&xit"), this);
   exitAct->setShortcut(tr("Ctrl+Q"));
   exitAct->setStatusTip(tr("Exit the application"));
   connect(exitAct, SIGNAL(triggered()), this, SLOT(close()));
   undoAct = new QAction(tr("&Undo"), this);
   undoAct->setShortcuts(QKeySequence::Undo);
   undoAct->setStatusTip(tr("Undo the last operation"));
   connect(undoAct, SIGNAL(triggered()), this, SLOT(undo()));
   redoAct = new QAction(tr("&Redo"), this);
   redoAct->setShortcuts(QKeySequence::Redo);
   redoAct->setStatusTip(tr("Redo the last operation"));
   connect(redoAct, SIGNAL(triggered()), this, SLOT(redo()));
   cutAct = new QAction(tr("Cu&t"), this);
   cutAct->setShortcuts(QKeySequence::Cut);
   cutAct->setStatusTip(tr("Cut the current selection"s contents to the "
                           "clipboard"));
   connect(cutAct, SIGNAL(triggered()), this, SLOT(cut()));
   copyAct = new QAction(tr("&Copy"), this);
   copyAct->setShortcut(tr("Ctrl+C"));
   copyAct->setStatusTip(tr("Copy the current selection"s contents to the "
                            "clipboard"));
   connect(copyAct, SIGNAL(triggered()), this, SLOT(copy()));
   pasteAct = new QAction(tr("&Paste"), this);
   pasteAct->setShortcuts(QKeySequence::Paste);
   pasteAct->setStatusTip(tr("Paste the clipboard"s contents into the current "
                             "selection"));
   connect(pasteAct, SIGNAL(triggered()), this, SLOT(paste()));
   boldAct = new QAction(tr("&Bold"), this);
   boldAct->setCheckable(true);
   boldAct->setShortcut(tr("Ctrl+B"));
   boldAct->setStatusTip(tr("Make the text bold"));
   connect(boldAct, SIGNAL(triggered()), this, SLOT(bold()));
   QFont boldFont = boldAct->font();
   boldFont.setBold(true);
   boldAct->setFont(boldFont);
   italicAct = new QAction(tr("&Italic"), this);
   italicAct->setCheckable(true);
   italicAct->setShortcut(tr("Ctrl+I"));
   italicAct->setStatusTip(tr("Make the text italic"));
   connect(italicAct, SIGNAL(triggered()), this, SLOT(italic()));
   QFont italicFont = italicAct->font();
   italicFont.setItalic(true);
   italicAct->setFont(italicFont);
   setLineSpacingAct = new QAction(tr("Set &Line Spacing..."), this);
   setLineSpacingAct->setStatusTip(tr("Change the gap between the lines of a "
                                      "paragraph"));
   connect(setLineSpacingAct, SIGNAL(triggered()), this, SLOT(setLineSpacing()));
   setParagraphSpacingAct = new QAction(tr("Set &Paragraph Spacing..."), this);
   setLineSpacingAct->setStatusTip(tr("Change the gap between paragraphs"));
   connect(setParagraphSpacingAct, SIGNAL(triggered()),
           this, SLOT(setParagraphSpacing()));
   aboutAct = new QAction(tr("&About"), this);
   aboutAct->setStatusTip(tr("Show the application"s About box"));
   connect(aboutAct, SIGNAL(triggered()), this, SLOT(about()));
   aboutQtAct = new QAction(tr("About &Qt"), this);
   aboutQtAct->setStatusTip(tr("Show the Qt library"s About box"));
   connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
   connect(aboutQtAct, SIGNAL(triggered()), this, SLOT(aboutQt()));
   leftAlignAct = new QAction(tr("&Left Align"), this);
   leftAlignAct->setCheckable(true);
   leftAlignAct->setShortcut(tr("Ctrl+L"));
   leftAlignAct->setStatusTip(tr("Left align the selected text"));
   connect(leftAlignAct, SIGNAL(triggered()), this, SLOT(leftAlign()));
   rightAlignAct = new QAction(tr("&Right Align"), this);
   rightAlignAct->setCheckable(true);
   rightAlignAct->setShortcut(tr("Ctrl+R"));
   rightAlignAct->setStatusTip(tr("Right align the selected text"));
   connect(rightAlignAct, SIGNAL(triggered()), this, SLOT(rightAlign()));
   justifyAct = new QAction(tr("&Justify"), this);
   justifyAct->setCheckable(true);
   justifyAct->setShortcut(tr("Ctrl+J"));
   justifyAct->setStatusTip(tr("Justify the selected text"));
   connect(justifyAct, SIGNAL(triggered()), this, SLOT(justify()));
   centerAct = new QAction(tr("&Center"), this);
   centerAct->setCheckable(true);
   centerAct->setShortcut(tr("Ctrl+E"));
   centerAct->setStatusTip(tr("Center the selected text"));
   connect(centerAct, SIGNAL(triggered()), this, SLOT(center()));

   alignmentGroup = new QActionGroup(this);
   alignmentGroup->addAction(leftAlignAct);
   alignmentGroup->addAction(rightAlignAct);
   alignmentGroup->addAction(justifyAct);
   alignmentGroup->addAction(centerAct);
   leftAlignAct->setChecked(true);

}

void MainWindow::createMenus() {

   fileMenu = menuBar()->addMenu(tr("&File"));
   fileMenu->addAction(newAct);
   fileMenu->addAction(openAct);
   fileMenu->addAction(saveAct);
   fileMenu->addAction(printAct);
   fileMenu->addSeparator();
   fileMenu->addAction(exitAct);
   editMenu = menuBar()->addMenu(tr("&Edit"));
   editMenu->addAction(undoAct);
   editMenu->addAction(redoAct);
   editMenu->addSeparator();
   editMenu->addAction(cutAct);
   editMenu->addAction(copyAct);
   editMenu->addAction(pasteAct);
   editMenu->addSeparator();
   helpMenu = menuBar()->addMenu(tr("&Help"));
   helpMenu->addAction(aboutAct);
   helpMenu->addAction(aboutQtAct);
   formatMenu = editMenu->addMenu(tr("&Format"));
   formatMenu->addAction(boldAct);
   formatMenu->addAction(italicAct);
   formatMenu->addSeparator()->setText(tr("Alignment"));
   formatMenu->addAction(leftAlignAct);
   formatMenu->addAction(rightAlignAct);
   formatMenu->addAction(justifyAct);
   formatMenu->addAction(centerAct);
   formatMenu->addSeparator();
   formatMenu->addAction(setLineSpacingAct);
   formatMenu->addAction(setParagraphSpacingAct);

}


  1. include <QApplication>
  2. include "mainwindow.h"

int main(int argc, char *argv[]) {

   QApplication app(argc, argv);
   MainWindow window;
   window.show();
   return app.exec();

}


 </source>


Image viewer

<source lang="cpp"> /****************************************************************************

    • Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
    • All rights reserved.
    • Contact: Nokia Corporation (qt-info@nokia.com)
    • This file is part of the examples of the Qt Toolkit.
    • $QT_BEGIN_LICENSE:LGPL$
    • Commercial Usage
    • Licensees holding valid Qt Commercial licenses may use this file in
    • accordance with the Qt Commercial License Agreement provided with the
    • Software or, alternatively, in accordance with the terms contained in
    • a written agreement between you and Nokia.
    • GNU Lesser General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU Lesser
    • General Public License version 2.1 as published by the Free Software
    • Foundation and appearing in the file LICENSE.LGPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU Lesser General Public License version 2.1 requirements
    • will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
    • In addition, as a special exception, Nokia gives you certain additional
    • rights. These rights are described in the Nokia Qt LGPL Exception
    • version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
    • GNU General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU
    • General Public License version 3.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 the GNU General Public License version 3.0 requirements will be
    • met: http://www.gnu.org/copyleft/gpl.html.
    • If you have questions regarding the use of this file, please contact
    • Nokia at qt-info@nokia.com.
    • $QT_END_LICENSE$
                                                                                                                                                        • /
  1. ifndef IMAGEVIEWER_H
  2. define IMAGEVIEWER_H
  3. include <QMainWindow>
  4. include <QPrinter>

QT_BEGIN_NAMESPACE class QAction; class QLabel; class QMenu; class QScrollArea; class QScrollBar; QT_END_NAMESPACE

class ImageViewer : public QMainWindow {

   Q_OBJECT

public:

   ImageViewer();

private slots:

   void open();
   void print();
   void zoomIn();
   void zoomOut();
   void normalSize();
   void fitToWindow();
   void about();

private:

   void createActions();
   void createMenus();
   void updateActions();
   void scaleImage(double factor);
   void adjustScrollBar(QScrollBar *scrollBar, double factor);
   QLabel *imageLabel;
   QScrollArea *scrollArea;
   double scaleFactor;
  1. ifndef QT_NO_PRINTER
   QPrinter printer;
  1. endif
   QAction *openAct;
   QAction *printAct;
   QAction *exitAct;
   QAction *zoomInAct;
   QAction *zoomOutAct;
   QAction *normalSizeAct;
   QAction *fitToWindowAct;
   QAction *aboutAct;
   QAction *aboutQtAct;
   QMenu *fileMenu;
   QMenu *viewMenu;
   QMenu *helpMenu;

};

  1. endif


  1. include <QtGui>
  2. include "imageviewer.h"

ImageViewer::ImageViewer() {

   imageLabel = new QLabel;
   imageLabel->setBackgroundRole(QPalette::Base);
   imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
   imageLabel->setScaledContents(true);
   scrollArea = new QScrollArea;
   scrollArea->setBackgroundRole(QPalette::Dark);
   scrollArea->setWidget(imageLabel);
   setCentralWidget(scrollArea);
   createActions();
   createMenus();
   setWindowTitle(tr("Image Viewer"));
   resize(500, 400);

}

void ImageViewer::open()

{

   QString fileName = QFileDialog::getOpenFileName(this,
                                   tr("Open File"), QDir::currentPath());
   if (!fileName.isEmpty()) {
       QImage image(fileName);
       if (image.isNull()) {
           QMessageBox::information(this, tr("Image Viewer"),
                                    tr("Cannot load %1.").arg(fileName));
           return;
       }

       imageLabel->setPixmap(QPixmap::fromImage(image));

       scaleFactor = 1.0;
       printAct->setEnabled(true);
       fitToWindowAct->setEnabled(true);
       updateActions();
       if (!fitToWindowAct->isChecked())
           imageLabel->adjustSize();
   }

}

void ImageViewer::print()

{

   Q_ASSERT(imageLabel->pixmap());
  1. ifndef QT_NO_PRINTER
   QPrintDialog dialog(&printer, this);

   if (dialog.exec()) {
       QPainter painter(&printer);
       QRect rect = painter.viewport();
       QSize size = imageLabel->pixmap()->size();
       size.scale(rect.size(), Qt::KeepAspectRatio);
       painter.setViewport(rect.x(), rect.y(), size.width(), size.height());
       painter.setWindow(imageLabel->pixmap()->rect());
       painter.drawPixmap(0, 0, *imageLabel->pixmap());
   }
  1. endif

}

void ImageViewer::zoomIn()

{

   scaleImage(1.25);

} void ImageViewer::zoomOut() {

   scaleImage(0.8);

}

void ImageViewer::normalSize()

{

   imageLabel->adjustSize();
   scaleFactor = 1.0;

}

void ImageViewer::fitToWindow()

{

   bool fitToWindow = fitToWindowAct->isChecked();
   scrollArea->setWidgetResizable(fitToWindow);
   if (!fitToWindow) {
       normalSize();
   }
   updateActions();

}


void ImageViewer::about()

{

   QMessageBox::about(this, tr("About Image Viewer"),
tr("

The Image Viewer example shows how to combine QLabel " "and QScrollArea to display an image. QLabel is typically used " "for displaying a text, but it can also display an image. " "QScrollArea provides a scrolling view around another widget. " "If the child widget exceeds the size of the frame, QScrollArea " "automatically provides scroll bars.

The example "

              "demonstrates how QLabel"s ability to scale its contents "
              "(QLabel::scaledContents), and QScrollArea"s ability to "
              "automatically resize its contents "
              "(QScrollArea::widgetResizable), can be used to implement "
"zooming and scaling features.

In addition the example " "shows how to use QPainter to print an image.

"));

}

void ImageViewer::createActions()

{

   openAct = new QAction(tr("&Open..."), this);
   openAct->setShortcut(tr("Ctrl+O"));
   connect(openAct, SIGNAL(triggered()), this, SLOT(open()));
   printAct = new QAction(tr("&Print..."), this);
   printAct->setShortcut(tr("Ctrl+P"));
   printAct->setEnabled(false);
   connect(printAct, SIGNAL(triggered()), this, SLOT(print()));
   exitAct = new QAction(tr("E&xit"), this);
   exitAct->setShortcut(tr("Ctrl+Q"));
   connect(exitAct, SIGNAL(triggered()), this, SLOT(close()));
   zoomInAct = new QAction(tr("Zoom &In (25%)"), this);
   zoomInAct->setShortcut(tr("Ctrl++"));
   zoomInAct->setEnabled(false);
   connect(zoomInAct, SIGNAL(triggered()), this, SLOT(zoomIn()));
   zoomOutAct = new QAction(tr("Zoom &Out (25%)"), this);
   zoomOutAct->setShortcut(tr("Ctrl+-"));
   zoomOutAct->setEnabled(false);
   connect(zoomOutAct, SIGNAL(triggered()), this, SLOT(zoomOut()));
   normalSizeAct = new QAction(tr("&Normal Size"), this);
   normalSizeAct->setShortcut(tr("Ctrl+S"));
   normalSizeAct->setEnabled(false);
   connect(normalSizeAct, SIGNAL(triggered()), this, SLOT(normalSize()));
   fitToWindowAct = new QAction(tr("&Fit to Window"), this);
   fitToWindowAct->setEnabled(false);
   fitToWindowAct->setCheckable(true);
   fitToWindowAct->setShortcut(tr("Ctrl+F"));
   connect(fitToWindowAct, SIGNAL(triggered()), this, SLOT(fitToWindow()));
   aboutAct = new QAction(tr("&About"), this);
   connect(aboutAct, SIGNAL(triggered()), this, SLOT(about()));
   aboutQtAct = new QAction(tr("About &Qt"), this);
   connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt()));

}

void ImageViewer::createMenus()

{

   fileMenu = new QMenu(tr("&File"), this);
   fileMenu->addAction(openAct);
   fileMenu->addAction(printAct);
   fileMenu->addSeparator();
   fileMenu->addAction(exitAct);
   viewMenu = new QMenu(tr("&View"), this);
   viewMenu->addAction(zoomInAct);
   viewMenu->addAction(zoomOutAct);
   viewMenu->addAction(normalSizeAct);
   viewMenu->addSeparator();
   viewMenu->addAction(fitToWindowAct);
   helpMenu = new QMenu(tr("&Help"), this);
   helpMenu->addAction(aboutAct);
   helpMenu->addAction(aboutQtAct);
   menuBar()->addMenu(fileMenu);
   menuBar()->addMenu(viewMenu);
   menuBar()->addMenu(helpMenu);

}

void ImageViewer::updateActions()

{

   zoomInAct->setEnabled(!fitToWindowAct->isChecked());
   zoomOutAct->setEnabled(!fitToWindowAct->isChecked());
   normalSizeAct->setEnabled(!fitToWindowAct->isChecked());

}

void ImageViewer::scaleImage(double factor)

{

   Q_ASSERT(imageLabel->pixmap());
   scaleFactor *= factor;
   imageLabel->resize(scaleFactor * imageLabel->pixmap()->size());
   adjustScrollBar(scrollArea->horizontalScrollBar(), factor);
   adjustScrollBar(scrollArea->verticalScrollBar(), factor);
   zoomInAct->setEnabled(scaleFactor < 3.0);
   zoomOutAct->setEnabled(scaleFactor > 0.333);

}

void ImageViewer::adjustScrollBar(QScrollBar *scrollBar, double factor)

{

   scrollBar->setValue(int(factor * scrollBar->value()
                           + ((factor - 1) * scrollBar->pageStep()/2)));

}


  1. include <QApplication>
  2. include "imageviewer.h"

int main(int argc, char *argv[]) {

   QApplication app(argc, argv);
   ImageViewer imageViewer;
   imageViewer.show();
   return app.exec();

}


 </source>


Recent file menu

<source lang="cpp"> /****************************************************************************

    • Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
    • All rights reserved.
    • Contact: Nokia Corporation (qt-info@nokia.com)
    • This file is part of the examples of the Qt Toolkit.
    • $QT_BEGIN_LICENSE:LGPL$
    • Commercial Usage
    • Licensees holding valid Qt Commercial licenses may use this file in
    • accordance with the Qt Commercial License Agreement provided with the
    • Software or, alternatively, in accordance with the terms contained in
    • a written agreement between you and Nokia.
    • GNU Lesser General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU Lesser
    • General Public License version 2.1 as published by the Free Software
    • Foundation and appearing in the file LICENSE.LGPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU Lesser General Public License version 2.1 requirements
    • will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
    • In addition, as a special exception, Nokia gives you certain additional
    • rights. These rights are described in the Nokia Qt LGPL Exception
    • version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
    • GNU General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU
    • General Public License version 3.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 the GNU General Public License version 3.0 requirements will be
    • met: http://www.gnu.org/copyleft/gpl.html.
    • If you have questions regarding the use of this file, please contact
    • Nokia at qt-info@nokia.com.
    • $QT_END_LICENSE$
                                                                                                                                                        • /
  1. ifndef MAINWINDOW_H
  2. define MAINWINDOW_H
  3. include <QList>
  4. include <QMainWindow>

QT_BEGIN_NAMESPACE class QAction; class QMenu; class QTextEdit; QT_END_NAMESPACE class MainWindow : public QMainWindow {

   Q_OBJECT

public:

   MainWindow();

private slots:

   void newFile();
   void open();
   void save();
   void saveAs();
   void openRecentFile();
   void about();

private:

   void createActions();
   void createMenus();
   void loadFile(const QString &fileName);
   void saveFile(const QString &fileName);
   void setCurrentFile(const QString &fileName);
   void updateRecentFileActions();
   QString strippedName(const QString &fullFileName);
   QString curFile;
   QTextEdit *textEdit;
   QMenu *fileMenu;
   QMenu *recentFilesMenu;
   QMenu *helpMenu;
   QAction *newAct;
   QAction *openAct;
   QAction *saveAct;
   QAction *saveAsAct;
   QAction *exitAct;
   QAction *aboutAct;
   QAction *aboutQtAct;
   QAction *separatorAct;
   enum { MaxRecentFiles = 5 };
   QAction *recentFileActs[MaxRecentFiles];

};

  1. endif


  1. include <QtGui>
  2. include "mainwindow.h"

MainWindow::MainWindow() {

   setAttribute(Qt::WA_DeleteOnClose);
   textEdit = new QTextEdit;
   setCentralWidget(textEdit);
   createActions();
   createMenus();
   (void)statusBar();
   setWindowTitle(tr("Recent Files"));
   resize(400, 300);

} void MainWindow::newFile() {

   MainWindow *other = new MainWindow;
   other->show();

} void MainWindow::open() {

   QString fileName = QFileDialog::getOpenFileName(this);
   if (!fileName.isEmpty())
       loadFile(fileName);

} void MainWindow::save() {

   if (curFile.isEmpty())
       saveAs();
   else
       saveFile(curFile);

} void MainWindow::saveAs() {

   QString fileName = QFileDialog::getSaveFileName(this);
   if (fileName.isEmpty())
       return;
   saveFile(fileName);

} void MainWindow::openRecentFile() {

   QAction *action = qobject_cast<QAction *>(sender());
   if (action)
       loadFile(action->data().toString());

} void MainWindow::about() {

  QMessageBox::about(this, tr("About Recent Files"),
           tr("The Recent Files example demonstrates how to provide a "
              "recently used file menu in a Qt application."));

} void MainWindow::createActions() {

   newAct = new QAction(tr("&New"), this);
   newAct->setShortcuts(QKeySequence::New);
   newAct->setStatusTip(tr("Create a new file"));
   connect(newAct, SIGNAL(triggered()), this, SLOT(newFile()));
   openAct = new QAction(tr("&Open..."), this);
   openAct->setShortcuts(QKeySequence::Open);
   openAct->setStatusTip(tr("Open an existing file"));
   connect(openAct, SIGNAL(triggered()), this, SLOT(open()));
   saveAct = new QAction(tr("&Save"), this);
   saveAct->setShortcuts(QKeySequence::Save);
   saveAct->setStatusTip(tr("Save the document to disk"));
   connect(saveAct, SIGNAL(triggered()), this, SLOT(save()));
   saveAsAct = new QAction(tr("Save &As..."), this);
   saveAsAct->setShortcuts(QKeySequence::SaveAs);
   saveAsAct->setStatusTip(tr("Save the document under a new name"));
   connect(saveAsAct, SIGNAL(triggered()), this, SLOT(saveAs()));
   for (int i = 0; i < MaxRecentFiles; ++i) {
       recentFileActs[i] = new QAction(this);
       recentFileActs[i]->setVisible(false);
       connect(recentFileActs[i], SIGNAL(triggered()),
               this, SLOT(openRecentFile()));
   }
   exitAct = new QAction(tr("E&xit"), this);
   exitAct->setShortcut(tr("Ctrl+Q"));
   exitAct->setStatusTip(tr("Exit the application"));
   connect(exitAct, SIGNAL(triggered()), qApp, SLOT(closeAllWindows()));
   aboutAct = new QAction(tr("&About"), this);
   aboutAct->setStatusTip(tr("Show the application"s About box"));
   connect(aboutAct, SIGNAL(triggered()), this, SLOT(about()));
   aboutQtAct = new QAction(tr("About &Qt"), this);
   aboutQtAct->setStatusTip(tr("Show the Qt library"s About box"));
   connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt()));

} void MainWindow::createMenus() {

   fileMenu = menuBar()->addMenu(tr("&File"));
   fileMenu->addAction(newAct);
   fileMenu->addAction(openAct);
   fileMenu->addAction(saveAct);
   fileMenu->addAction(saveAsAct);
   separatorAct = fileMenu->addSeparator();
   for (int i = 0; i < MaxRecentFiles; ++i)
       fileMenu->addAction(recentFileActs[i]);
   fileMenu->addSeparator();
   fileMenu->addAction(exitAct);
   updateRecentFileActions();
   menuBar()->addSeparator();
   helpMenu = menuBar()->addMenu(tr("&Help"));
   helpMenu->addAction(aboutAct);
   helpMenu->addAction(aboutQtAct);

} void MainWindow::loadFile(const QString &fileName) {

   QFile file(fileName);
   if (!file.open(QFile::ReadOnly | QFile::Text)) {
       QMessageBox::warning(this, tr("Recent Files"),
                            tr("Cannot read file %1:\n%2.")
                            .arg(fileName)
                            .arg(file.errorString()));
       return;
   }
   QTextStream in(&file);
   QApplication::setOverrideCursor(Qt::WaitCursor);
   textEdit->setPlainText(in.readAll());
   QApplication::restoreOverrideCursor();
   setCurrentFile(fileName);
   statusBar()->showMessage(tr("File loaded"), 2000);

} void MainWindow::saveFile(const QString &fileName) {

   QFile file(fileName);
   if (!file.open(QFile::WriteOnly | QFile::Text)) {
       QMessageBox::warning(this, tr("Recent Files"),
                            tr("Cannot write file %1:\n%2.")
                            .arg(fileName)
                            .arg(file.errorString()));
       return;
   }
   QTextStream out(&file);
   QApplication::setOverrideCursor(Qt::WaitCursor);
   out << textEdit->toPlainText();
   QApplication::restoreOverrideCursor();
   setCurrentFile(fileName);
   statusBar()->showMessage(tr("File saved"), 2000);

} void MainWindow::setCurrentFile(const QString &fileName) {

   curFile = fileName;
   if (curFile.isEmpty())
       setWindowTitle(tr("Recent Files"));
   else
       setWindowTitle(tr("%1 - %2").arg(strippedName(curFile))
                                   .arg(tr("Recent Files")));
   QSettings settings("Trolltech", "Recent Files Example");
   QStringList files = settings.value("recentFileList").toStringList();
   files.removeAll(fileName);
   files.prepend(fileName);
   while (files.size() > MaxRecentFiles)
       files.removeLast();
   settings.setValue("recentFileList", files);
   foreach (QWidget *widget, QApplication::topLevelWidgets()) {
       MainWindow *mainWin = qobject_cast<MainWindow *>(widget);
       if (mainWin)
           mainWin->updateRecentFileActions();
   }

} void MainWindow::updateRecentFileActions() {

   QSettings settings("Trolltech", "Recent Files Example");
   QStringList files = settings.value("recentFileList").toStringList();
   int numRecentFiles = qMin(files.size(), (int)MaxRecentFiles);
   for (int i = 0; i < numRecentFiles; ++i) {
       QString text = tr("&%1 %2").arg(i + 1).arg(strippedName(files[i]));
       recentFileActs[i]->setText(text);
       recentFileActs[i]->setData(files[i]);
       recentFileActs[i]->setVisible(true);
   }
   for (int j = numRecentFiles; j < MaxRecentFiles; ++j)
       recentFileActs[j]->setVisible(false);
   separatorAct->setVisible(numRecentFiles > 0);

} QString MainWindow::strippedName(const QString &fullFileName) {

   return QFileInfo(fullFileName).fileName();

}

  1. include <QApplication>
  2. include "mainwindow.h"

int main(int argc, char *argv[]) {

   QApplication app(argc, argv);
   MainWindow *mainWin = new MainWindow;
   mainWin->show();
   return app.exec();

}


 </source>