#include #include #include class QAction; class QActionGroup; class QLabel; class QMenu; 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; }; MainWindow::MainWindow() { QWidget *w = new QWidget; setCentralWidget(w); 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 *vbox = new QVBoxLayout; vbox->setMargin(5); vbox->addWidget(topFiller); vbox->addWidget(infoLabel); vbox->addWidget(bottomFiller); w->setLayout(vbox); createActions(); createMenus(); statusBar()->showMessage(tr("A context menu is available by right-clicking")); 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->setShortcut(tr("Ctrl+N")); newAct->setStatusTip(tr("Create a new file")); connect(newAct, SIGNAL(triggered()), this, SLOT(newFile())); openAct = new QAction(tr("&Open..."), this); openAct->setShortcut(tr("Ctrl+O")); openAct->setStatusTip(tr("Open an existing file")); connect(openAct, SIGNAL(triggered()), this, SLOT(open())); saveAct = new QAction(tr("&Save"), this); saveAct->setShortcut(tr("Ctrl+S")); saveAct->setStatusTip(tr("Save the document to disk")); connect(saveAct, SIGNAL(triggered()), this, SLOT(save())); printAct = new QAction(tr("&Print..."), this); printAct->setShortcut(tr("Ctrl+P")); 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->setShortcut(tr("Ctrl+Z")); undoAct->setStatusTip(tr("Undo the last operation")); connect(undoAct, SIGNAL(triggered()), this, SLOT(undo())); redoAct = new QAction(tr("&Redo"), this); redoAct->setShortcut(tr("Ctrl+Y")); redoAct->setStatusTip(tr("Redo the last operation")); connect(redoAct, SIGNAL(triggered()), this, SLOT(redo())); cutAct = new QAction(tr("Cu&t"), this); cutAct->setShortcut(tr("Ctrl+X")); 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->setShortcut(tr("Ctrl+V")); 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); 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); 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())); } 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(); 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); helpMenu = menuBar()->addMenu(tr("&Help")); helpMenu->addAction(aboutAct); helpMenu->addAction(aboutQtAct); } int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow window; window.show(); return app.exec(); }