<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <!-- /home/espenr/tmp/qt-3.3.8-espenr-2499/qt-x11-free-3.3.8/examples/menu/menu.doc:4 --> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Using menus</title> <style type="text/css"><!-- fn { margin-left: 1cm; text-indent: -1cm; } a:link { color: #004faf; text-decoration: none } a:visited { color: #672967; text-decoration: none } body { background: #ffffff; color: black; } --></style> </head> <body> <table border="0" cellpadding="0" cellspacing="0" width="100%"> <tr bgcolor="#E5E5E5"> <td valign=center> <a href="index.html"> <font color="#004faf">Home</font></a> | <a href="classes.html"> <font color="#004faf">All Classes</font></a> | <a href="mainclasses.html"> <font color="#004faf">Main Classes</font></a> | <a href="annotated.html"> <font color="#004faf">Annotated</font></a> | <a href="groups.html"> <font color="#004faf">Grouped Classes</font></a> | <a href="functions.html"> <font color="#004faf">Functions</font></a> </td> <td align="right" valign="center"><img src="logo32.png" align="right" width="64" height="32" border="0"></td></tr></table><h1 align=center>Using menus</h1> <p> This example demonstrates a menu bar with pull-down menus, sub-menus and custom menu items. It also demonstrates a pop-up context menu. <p> <hr> <p> Header file: <p> <pre>/**************************************************************************** ** $Id: qt/menu.h 3.3.8 edited Jan 11 14:37 $ ** ** Copyright (C) 1992-2007 Trolltech ASA. All rights reserved. ** ** This file is part of an example program for Qt. This example ** program may be used, distributed and modified without limitation. ** *****************************************************************************/ #ifndef MENU_H #define MENU_H #include <<a href="qwidget-h.html">qwidget.h</a>> #include <<a href="qmenubar-h.html">qmenubar.h</a>> #include <<a href="qlabel-h.html">qlabel.h</a>> class MenuExample : public <a href="qwidget.html">QWidget</a> { <a href="metaobjects.html#Q_OBJECT">Q_OBJECT</a> public: MenuExample( <a href="qwidget.html">QWidget</a> *parent=0, const char *name=0 ); public slots: void open(); void news(); void save(); void closeDoc(); void undo(); void redo(); void normal(); void bold(); void underline(); void about(); void aboutQt(); void printer(); void file(); void fax(); void printerSetup(); protected: void resizeEvent( <a href="qresizeevent.html">QResizeEvent</a> * ); signals: void explain( const <a href="qstring.html">QString</a>& ); private: void contextMenuEvent ( <a href="qcontextmenuevent.html">QContextMenuEvent</a> * ); <a href="qmenubar.html">QMenuBar</a> *menu; <a href="qlabel.html">QLabel</a> *label; bool isBold; bool isUnderline; int boldID, underlineID; }; #endif // MENU_H </pre> <p> <hr> <p> Implementation: <p> <pre>/**************************************************************************** ** $Id: qt/menu.cpp 3.3.8 edited Jan 11 14:37 $ ** ** Copyright (C) 1992-2007 Trolltech ASA. All rights reserved. ** ** This file is part of an example program for Qt. This example ** program may be used, distributed and modified without limitation. ** *****************************************************************************/ #include "menu.h" #include <<a href="qcursor-h.html">qcursor.h</a>> #include <<a href="qpopupmenu-h.html">qpopupmenu.h</a>> #include <<a href="qapplication-h.html">qapplication.h</a>> #include <<a href="qmessagebox-h.html">qmessagebox.h</a>> #include <<a href="qpixmap-h.html">qpixmap.h</a>> #include <<a href="qpainter-h.html">qpainter.h</a>> /* XPM */ static const char * p1_xpm[] = { "16 16 3 1", " c None", ". c #000000000000", "X c #FFFFFFFF0000", " ", " ", " .... ", " .XXXX. ", " .............. ", " .XXXXXXXXXXXX. ", " .XXXXXXXXXXXX. ", " .XXXXXXXXXXXX. ", " .XXXXXXXXXXXX. ", " .XXXXXXXXXXXX. ", " .XXXXXXXXXXXX. ", " .XXXXXXXXXXXX. ", " .XXXXXXXXXXXX. ", " .XXXXXXXXXXXX. ", " .............. ", " "}; /* XPM */ static const char * p2_xpm[] = { "16 16 3 1", " c None", ". c #000000000000", "X c #FFFFFFFFFFFF", " ", " ...... ", " .XXX.X. ", " .XXX.XX. ", " .XXX.XXX. ", " .XXX..... ", " .XXXXXXX. ", " .XXXXXXX. ", " .XXXXXXX. ", " .XXXXXXX. ", " .XXXXXXX. ", " .XXXXXXX. ", " .XXXXXXX. ", " ......... ", " ", " "}; /* XPM */ static const char * p3_xpm[] = { "16 16 3 1", " c None", ". c #000000000000", "X c #FFFFFFFFFFFF", " ", " ", " ......... ", " ........... ", " ........ .. ", " ........... ", " ........... ", " ........... ", " ........... ", " ...XXXXX... ", " ...XXXXX... ", " ...XXXXX... ", " ...XXXXX... ", " ......... ", " ", " "}; /* Auxiliary class to provide fancy menu items with different fonts. Used for the "bold" and "underline" menu items in the options menu. */ class MyMenuItem : public <a href="qcustommenuitem.html">QCustomMenuItem</a> { public: MyMenuItem( const <a href="qstring.html">QString</a>& s, const <a href="qfont.html">QFont</a>& f ) : string( s ), font( f ){}; ~MyMenuItem(){} void paint( <a href="qpainter.html">QPainter</a>* p, const QColorGroup& /*cg*/, bool /*act*/, bool /*enabled*/, int x, int y, int w, int h ) { p-><a href="qpainter.html#setFont">setFont</a> ( font ); p-><a href="qpainter.html#drawText">drawText</a>( x, y, w, h, AlignLeft | AlignVCenter | DontClip | ShowPrefix, string ); } <a href="qsize.html">QSize</a> sizeHint() { return QFontMetrics( font ).size( AlignLeft | AlignVCenter | ShowPrefix | DontClip, string ); } private: <a href="qstring.html">QString</a> string; <a href="qfont.html">QFont</a> font; }; <a name="f501"></a>MenuExample::MenuExample( <a href="qwidget.html">QWidget</a> *parent, const char *name ) : <a href="qwidget.html">QWidget</a>( parent, name ) { <a href="qpixmap.html">QPixmap</a> p1( p1_xpm ); <a href="qpixmap.html">QPixmap</a> p2( p2_xpm ); <a href="qpixmap.html">QPixmap</a> p3( p3_xpm ); <a href="qpopupmenu.html">QPopupMenu</a> *print = new <a href="qpopupmenu.html">QPopupMenu</a>( this ); <a href="qapplication.html#Q_CHECK_PTR">Q_CHECK_PTR</a>( print ); <a name="x1879"></a> print-><a href="qpopupmenu.html#insertTearOffHandle">insertTearOffHandle</a>(); <a name="x1869"></a> print-><a href="qmenudata.html#insertItem">insertItem</a>( "&Print to printer", this, SLOT(printer()) ); print-><a href="qmenudata.html#insertItem">insertItem</a>( "Print to &file", this, SLOT(file()) ); print-><a href="qmenudata.html#insertItem">insertItem</a>( "Print to fa&x", this, SLOT(fax()) ); <a name="x1870"></a> print-><a href="qmenudata.html#insertSeparator">insertSeparator</a>(); print-><a href="qmenudata.html#insertItem">insertItem</a>( "Printer &Setup", this, SLOT(printerSetup()) ); <a href="qpopupmenu.html">QPopupMenu</a> *file = new <a href="qpopupmenu.html">QPopupMenu</a>( this ); <a href="qapplication.html#Q_CHECK_PTR">Q_CHECK_PTR</a>( file ); file-><a href="qmenudata.html#insertItem">insertItem</a>( p1, "&Open", this, SLOT(open()), CTRL+Key_O ); file-><a href="qmenudata.html#insertItem">insertItem</a>( p2, "&New", this, SLOT(news()), CTRL+Key_N ); file-><a href="qmenudata.html#insertItem">insertItem</a>( p3, "&Save", this, SLOT(save()), CTRL+Key_S ); file-><a href="qmenudata.html#insertItem">insertItem</a>( "&Close", this, SLOT(closeDoc()), CTRL+Key_W ); file-><a href="qmenudata.html#insertSeparator">insertSeparator</a>(); file-><a href="qmenudata.html#insertItem">insertItem</a>( "&Print", print, CTRL+Key_P ); file-><a href="qmenudata.html#insertSeparator">insertSeparator</a>(); file-><a href="qmenudata.html#insertItem">insertItem</a>( "E&xit", qApp, SLOT(<a href="qapplication.html#quit">quit</a>()), CTRL+Key_Q ); <a href="qpopupmenu.html">QPopupMenu</a> *edit = new <a href="qpopupmenu.html">QPopupMenu</a>( this ); <a href="qapplication.html#Q_CHECK_PTR">Q_CHECK_PTR</a>( edit ); int undoID = edit-><a href="qmenudata.html#insertItem">insertItem</a>( "&Undo", this, SLOT(undo()) ); int redoID = edit-><a href="qmenudata.html#insertItem">insertItem</a>( "&Redo", this, SLOT(redo()) ); <a name="x1873"></a> edit-><a href="qmenudata.html#setItemEnabled">setItemEnabled</a>( undoID, FALSE ); edit-><a href="qmenudata.html#setItemEnabled">setItemEnabled</a>( redoID, FALSE ); <a href="qpopupmenu.html">QPopupMenu</a>* options = new <a href="qpopupmenu.html">QPopupMenu</a>( this ); <a href="qapplication.html#Q_CHECK_PTR">Q_CHECK_PTR</a>( options ); options-><a href="qpopupmenu.html#insertTearOffHandle">insertTearOffHandle</a>(); options-><a href="qwidget.html#setCaption">setCaption</a>("Options"); options-><a href="qmenudata.html#insertItem">insertItem</a>( "&Normal Font", this, SLOT(normal()) ); options-><a href="qmenudata.html#insertSeparator">insertSeparator</a>(); <a name="x1883"></a> options-><a href="qwidget.html#polish">polish</a>(); // adjust system settings <a name="x1882"></a> <a href="qfont.html">QFont</a> f = options-><a href="qwidget.html#font">font</a>(); <a name="x1860"></a> f.<a href="qfont.html#setBold">setBold</a>( TRUE ); boldID = options-><a href="qmenudata.html#insertItem">insertItem</a>( new MyMenuItem( "Bold", f ) ); <a name="x1871"></a> options-><a href="qmenudata.html#setAccel">setAccel</a>( CTRL+Key_B, boldID ); <a name="x1868"></a> options-><a href="qmenudata.html#connectItem">connectItem</a>( boldID, this, SLOT(bold()) ); f = <a href="qwidget.html#font">font</a>(); <a name="x1861"></a> f.<a href="qfont.html#setUnderline">setUnderline</a>( TRUE ); underlineID = options-><a href="qmenudata.html#insertItem">insertItem</a>( new MyMenuItem( "Underline", f ) ); options-><a href="qmenudata.html#setAccel">setAccel</a>( CTRL+Key_U, underlineID ); options-><a href="qmenudata.html#connectItem">connectItem</a>( underlineID, this, SLOT(underline()) ); isBold = FALSE; isUnderline = FALSE; <a name="x1880"></a> options-><a href="qpopupmenu.html#setCheckable">setCheckable</a>( TRUE ); <a href="qpopupmenu.html">QPopupMenu</a> *help = new <a href="qpopupmenu.html">QPopupMenu</a>( this ); <a href="qapplication.html#Q_CHECK_PTR">Q_CHECK_PTR</a>( help ); help-><a href="qmenudata.html#insertItem">insertItem</a>( "&About", this, SLOT(about()), CTRL+Key_H ); help-><a href="qmenudata.html#insertItem">insertItem</a>( "About &Qt", this, SLOT(aboutQt()) ); // If we used a QMainWindow we could use its built-in menuBar(). menu = new <a href="qmenubar.html">QMenuBar</a>( this ); <a href="qapplication.html#Q_CHECK_PTR">Q_CHECK_PTR</a>( menu ); menu-><a href="qmenudata.html#insertItem">insertItem</a>( "&File", file ); menu-><a href="qmenudata.html#insertItem">insertItem</a>( "&Edit", edit ); menu-><a href="qmenudata.html#insertItem">insertItem</a>( "&Options", options ); menu-><a href="qmenudata.html#insertSeparator">insertSeparator</a>(); menu-><a href="qmenudata.html#insertItem">insertItem</a>( "&Help", help ); <a name="x1867"></a> menu-><a href="qmenubar.html#setSeparator">setSeparator</a>( QMenuBar::InWindowsStyle ); <a href="qlabel.html">QLabel</a> *msg = new <a href="qlabel.html">QLabel</a>( this ); <a href="qapplication.html#Q_CHECK_PTR">Q_CHECK_PTR</a>( msg ); msg-><a href="qlabel.html#setText">setText</a>( "A context menu is available.\n" "Invoke it by right-clicking or by" " pressing the 'context' button." ); <a name="x1886"></a> msg-><a href="qwidget.html#setGeometry">setGeometry</a>( 0, height() - 60, width(), 60 ); <a name="x1864"></a> msg-><a href="qlabel.html#setAlignment">setAlignment</a>( AlignCenter ); label = new <a href="qlabel.html">QLabel</a>( this ); <a href="qapplication.html#Q_CHECK_PTR">Q_CHECK_PTR</a>( label ); label-><a href="qwidget.html#setGeometry">setGeometry</a>( 20, rect().center().y()-20, width()-40, 40 ); label-><a href="qframe.html#setFrameStyle">setFrameStyle</a>( QFrame::Box | QFrame::Raised ); <a name="x1863"></a> label-><a href="qframe.html#setLineWidth">setLineWidth</a>( 1 ); label-><a href="qlabel.html#setAlignment">setAlignment</a>( AlignCenter ); <a href="qobject.html#connect">connect</a>( this, SIGNAL(explain(const <a href="qstring.html">QString</a>&)), label, SLOT(<a href="qlabel.html#setText">setText</a>(const <a href="qstring.html">QString</a>&)) ); <a href="qwidget.html#setMinimumSize">setMinimumSize</a>( 100, 80 ); <a href="qwidget.html#setFocusPolicy">setFocusPolicy</a>( QWidget::ClickFocus ); } <a name="x1881"></a>void MenuExample::<a href="qwidget.html#contextMenuEvent">contextMenuEvent</a>( <a href="qcontextmenuevent.html">QContextMenuEvent</a> * ) { <a href="qpopupmenu.html">QPopupMenu</a>* contextMenu = new <a href="qpopupmenu.html">QPopupMenu</a>( this ); <a href="qapplication.html#Q_CHECK_PTR">Q_CHECK_PTR</a>( contextMenu ); <a href="qlabel.html">QLabel</a> *caption = new <a href="qlabel.html">QLabel</a>( "<font color=darkblue><u><b>" "Context Menu</b></u></font>", this ); caption-><a href="qlabel.html#setAlignment">setAlignment</a>( Qt::AlignCenter ); contextMenu-><a href="qmenudata.html#insertItem">insertItem</a>( caption ); contextMenu-><a href="qmenudata.html#insertItem">insertItem</a>( "&New", this, SLOT(news()), CTRL+Key_N ); contextMenu-><a href="qmenudata.html#insertItem">insertItem</a>( "&Open...", this, SLOT(open()), CTRL+Key_O ); contextMenu-><a href="qmenudata.html#insertItem">insertItem</a>( "&Save", this, SLOT(save()), CTRL+Key_S ); <a href="qpopupmenu.html">QPopupMenu</a> *submenu = new <a href="qpopupmenu.html">QPopupMenu</a>( this ); <a href="qapplication.html#Q_CHECK_PTR">Q_CHECK_PTR</a>( submenu ); submenu-><a href="qmenudata.html#insertItem">insertItem</a>( "&Print to printer", this, SLOT(printer()) ); submenu-><a href="qmenudata.html#insertItem">insertItem</a>( "Print to &file", this, SLOT(file()) ); submenu-><a href="qmenudata.html#insertItem">insertItem</a>( "Print to fa&x", this, SLOT(fax()) ); contextMenu-><a href="qmenudata.html#insertItem">insertItem</a>( "&Print", submenu ); <a name="x1878"></a><a name="x1859"></a> contextMenu-><a href="qpopupmenu.html#exec">exec</a>( QCursor::<a href="qcursor.html#pos">pos</a>() ); delete contextMenu; } void <a name="f502"></a>MenuExample::open() { emit explain( "File/Open selected" ); } void <a name="f503"></a>MenuExample::news() { emit explain( "File/New selected" ); } void <a name="f504"></a>MenuExample::save() { emit explain( "File/Save selected" ); } void <a name="f505"></a>MenuExample::closeDoc() { emit explain( "File/Close selected" ); } void <a name="f506"></a>MenuExample::undo() { emit explain( "Edit/Undo selected" ); } void <a name="f507"></a>MenuExample::redo() { emit explain( "Edit/Redo selected" ); } void <a name="f508"></a>MenuExample::normal() { isBold = FALSE; isUnderline = FALSE; <a href="qfont.html">QFont</a> font; <a name="x1865"></a> label-><a href="qlabel.html#setFont">setFont</a>( font ); <a name="x1872"></a> menu-><a href="qmenudata.html#setItemChecked">setItemChecked</a>( boldID, isBold ); menu-><a href="qmenudata.html#setItemChecked">setItemChecked</a>( underlineID, isUnderline ); emit explain( "Options/Normal selected" ); } void <a name="f509"></a>MenuExample::bold() { isBold = !isBold; <a href="qfont.html">QFont</a> font; font.<a href="qfont.html#setBold">setBold</a>( isBold ); font.<a href="qfont.html#setUnderline">setUnderline</a>( isUnderline ); label-><a href="qlabel.html#setFont">setFont</a>( font ); menu-><a href="qmenudata.html#setItemChecked">setItemChecked</a>( boldID, isBold ); emit explain( "Options/Bold selected" ); } void <a name="f510"></a>MenuExample::underline() { isUnderline = !isUnderline; <a href="qfont.html">QFont</a> font; font.<a href="qfont.html#setBold">setBold</a>( isBold ); font.<a href="qfont.html#setUnderline">setUnderline</a>( isUnderline ); label-><a href="qlabel.html#setFont">setFont</a>( font ); menu-><a href="qmenudata.html#setItemChecked">setItemChecked</a>( underlineID, isUnderline ); emit explain( "Options/Underline selected" ); } void <a name="f511"></a>MenuExample::about() { <a name="x1874"></a> QMessageBox::<a href="qmessagebox.html#about">about</a>( this, "Qt Menu Example", "This example demonstrates simple use of Qt menus.\n" "You can cut and paste lines from it to your own\n" "programs." ); } void <a name="f512"></a>MenuExample::aboutQt() { <a name="x1875"></a> QMessageBox::<a href="qmessagebox.html#aboutQt">aboutQt</a>( this, "Qt Menu Example" ); } void <a name="f513"></a>MenuExample::printer() { emit explain( "File/Printer/Print selected" ); } void <a name="f514"></a>MenuExample::file() { emit explain( "File/Printer/Print To File selected" ); } void <a name="f515"></a>MenuExample::fax() { emit explain( "File/Printer/Print To Fax selected" ); } void <a name="f516"></a>MenuExample::printerSetup() { emit explain( "File/Printer/Printer Setup selected" ); } <a name="x1884"></a>void MenuExample::<a href="qwidget.html#resizeEvent">resizeEvent</a>( <a href="qresizeevent.html">QResizeEvent</a> * ) { label-><a href="qwidget.html#setGeometry">setGeometry</a>( 20, rect().center().y()-20, width()-40, 40 ); } int main( int argc, char ** argv ) { <a href="qapplication.html">QApplication</a> a( argc, argv ); MenuExample m; m.<a href="qwidget.html#setCaption">setCaption</a>("Qt Examples - Menus"); a.<a href="qapplication.html#setMainWidget">setMainWidget</a>( &m ); m.<a href="qwidget.html#show">show</a>(); return a.<a href="qapplication.html#exec">exec</a>(); } </pre> <p>See also <a href="examples.html">Examples</a>. <!-- eof --> <p><address><hr><div align=center> <table width=100% cellspacing=0 border=0><tr> <td>Copyright © 2007 <a href="troll.html">Trolltech</a><td align=center><a href="trademarks.html">Trademarks</a> <td align=right><div align=right>Qt 3.3.8</div> </table></div></address></body> </html>