Home | All Classes | Main Classes | Annotated | Grouped Classes | Functions |
This example demonstrates a menu bar with pull-down menus, sub-menus and custom menu items. It also demonstrates a pop-up context menu.
Header file:
/**************************************************************************** ** $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 TQt. This example ** program may be used, distributed and modified without limitation. ** *****************************************************************************/ #ifndef MENU_H #define MENU_H #include <ntqwidget.h> #include <ntqmenubar.h> #include <ntqlabel.h> class MenuExample : public TQWidget { TQ_OBJECT public: MenuExample( TQWidget *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 aboutTQt(); void printer(); void file(); void fax(); void printerSetup(); protected: void resizeEvent( TQResizeEvent * ); signals: void explain( const TQString& ); private: void contextMenuEvent ( TQContextMenuEvent * ); TQMenuBar *menu; TQLabel *label; bool isBold; bool isUnderline; int boldID, underlineID; }; #endif // MENU_H
Implementation:
/**************************************************************************** ** $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 TQt. This example ** program may be used, distributed and modified without limitation. ** *****************************************************************************/ #include "menu.h" #include <ntqcursor.h> #include <ntqpopupmenu.h> #include <ntqapplication.h> #include <ntqmessagebox.h> #include <ntqpixmap.h> #include <ntqpainter.h> /* 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 TQCustomMenuItem { public: MyMenuItem( const TQString& s, const TQFont& f ) : string( s ), font( f ){}; ~MyMenuItem(){} void paint( TQPainter* p, const TQColorGroup& /*cg*/, bool /*act*/, bool /*enabled*/, int x, int y, int w, int h ) { p->setFont ( font ); p->drawText( x, y, w, h, AlignLeft | AlignVCenter | DontClip | ShowPrefix, string ); } TQSize sizeHint() { return TQFontMetrics( font ).size( AlignLeft | AlignVCenter | ShowPrefix | DontClip, string ); } private: TQString string; TQFont font; }; MenuExample::MenuExample( TQWidget *parent, const char *name ) : TQWidget( parent, name ) { TQPixmap p1( p1_xpm ); TQPixmap p2( p2_xpm ); TQPixmap p3( p3_xpm ); TQPopupMenu *print = new TQPopupMenu( this ); TQ_CHECK_PTR( print ); print->insertTearOffHandle(); print->insertItem( "&Print to printer", this, TQ_SLOT(printer()) ); print->insertItem( "Print to &file", this, TQ_SLOT(file()) ); print->insertItem( "Print to fa&x", this, TQ_SLOT(fax()) ); print->insertSeparator(); print->insertItem( "Printer &Setup", this, TQ_SLOT(printerSetup()) ); TQPopupMenu *file = new TQPopupMenu( this ); TQ_CHECK_PTR( file ); file->insertItem( p1, "&Open", this, TQ_SLOT(open()), CTRL+Key_O ); file->insertItem( p2, "&New", this, TQ_SLOT(news()), CTRL+Key_N ); file->insertItem( p3, "&Save", this, TQ_SLOT(save()), CTRL+Key_S ); file->insertItem( "&Close", this, TQ_SLOT(closeDoc()), CTRL+Key_W ); file->insertSeparator(); file->insertItem( "&Print", print, CTRL+Key_P ); file->insertSeparator(); file->insertItem( "E&xit", tqApp, TQ_SLOT(quit()), CTRL+Key_Q ); TQPopupMenu *edit = new TQPopupMenu( this ); TQ_CHECK_PTR( edit ); int undoID = edit->insertItem( "&Undo", this, TQ_SLOT(undo()) ); int redoID = edit->insertItem( "&Redo", this, TQ_SLOT(redo()) ); edit->setItemEnabled( undoID, FALSE ); edit->setItemEnabled( redoID, FALSE ); TQPopupMenu* options = new TQPopupMenu( this ); TQ_CHECK_PTR( options ); options->insertTearOffHandle(); options->setCaption("Options"); options->insertItem( "&Normal Font", this, TQ_SLOT(normal()) ); options->insertSeparator(); options->polish(); // adjust system settings TQFont f = options->font(); f.setBold( TRUE ); boldID = options->insertItem( new MyMenuItem( "Bold", f ) ); options->setAccel( CTRL+Key_B, boldID ); options->connectItem( boldID, this, TQ_SLOT(bold()) ); f = font(); f.setUnderline( TRUE ); underlineID = options->insertItem( new MyMenuItem( "Underline", f ) ); options->setAccel( CTRL+Key_U, underlineID ); options->connectItem( underlineID, this, TQ_SLOT(underline()) ); isBold = FALSE; isUnderline = FALSE; options->setCheckable( TRUE ); TQPopupMenu *help = new TQPopupMenu( this ); TQ_CHECK_PTR( help ); help->insertItem( "&About", this, TQ_SLOT(about()), CTRL+Key_H ); help->insertItem( "About &TQt", this, TQ_SLOT(aboutTQt()) ); // If we used a TQMainWindow we could use its built-in menuBar(). menu = new TQMenuBar( this ); TQ_CHECK_PTR( menu ); menu->insertItem( "&File", file ); menu->insertItem( "&Edit", edit ); menu->insertItem( "&Options", options ); menu->insertSeparator(); menu->insertItem( "&Help", help ); menu->setSeparator( TQMenuBar::InWindowsStyle ); TQLabel *msg = new TQLabel( this ); TQ_CHECK_PTR( msg ); msg->setText( "A context menu is available.\n" "Invoke it by right-clicking or by" " pressing the 'context' button." ); msg->setGeometry( 0, height() - 60, width(), 60 ); msg->setAlignment( AlignCenter ); label = new TQLabel( this ); TQ_CHECK_PTR( label ); label->setGeometry( 20, rect().center().y()-20, width()-40, 40 ); label->setFrameStyle( TQFrame::Box | TQFrame::Raised ); label->setLineWidth( 1 ); label->setAlignment( AlignCenter ); connect( this, TQ_SIGNAL(explain(const TQString&)), label, TQ_SLOT(setText(const TQString&)) ); setMinimumSize( 100, 80 ); setFocusPolicy( TQWidget::ClickFocus ); } void MenuExample::contextMenuEvent( TQContextMenuEvent * ) { TQPopupMenu* contextMenu = new TQPopupMenu( this ); TQ_CHECK_PTR( contextMenu ); TQLabel *caption = new TQLabel( "<font color=darkblue><u><b>" "Context Menu</b></u></font>", this ); caption->setAlignment( TQt::AlignCenter ); contextMenu->insertItem( caption ); contextMenu->insertItem( "&New", this, TQ_SLOT(news()), CTRL+Key_N ); contextMenu->insertItem( "&Open...", this, TQ_SLOT(open()), CTRL+Key_O ); contextMenu->insertItem( "&Save", this, TQ_SLOT(save()), CTRL+Key_S ); TQPopupMenu *submenu = new TQPopupMenu( this ); TQ_CHECK_PTR( submenu ); submenu->insertItem( "&Print to printer", this, TQ_SLOT(printer()) ); submenu->insertItem( "Print to &file", this, TQ_SLOT(file()) ); submenu->insertItem( "Print to fa&x", this, TQ_SLOT(fax()) ); contextMenu->insertItem( "&Print", submenu ); contextMenu->exec( TQCursor::pos() ); delete contextMenu; } void MenuExample::open() { emit explain( "File/Open selected" ); } void MenuExample::news() { emit explain( "File/New selected" ); } void MenuExample::save() { emit explain( "File/Save selected" ); } void MenuExample::closeDoc() { emit explain( "File/Close selected" ); } void MenuExample::undo() { emit explain( "Edit/Undo selected" ); } void MenuExample::redo() { emit explain( "Edit/Redo selected" ); } void MenuExample::normal() { isBold = FALSE; isUnderline = FALSE; TQFont font; label->setFont( font ); menu->setItemChecked( boldID, isBold ); menu->setItemChecked( underlineID, isUnderline ); emit explain( "Options/Normal selected" ); } void MenuExample::bold() { isBold = !isBold; TQFont font; font.setBold( isBold ); font.setUnderline( isUnderline ); label->setFont( font ); menu->setItemChecked( boldID, isBold ); emit explain( "Options/Bold selected" ); } void MenuExample::underline() { isUnderline = !isUnderline; TQFont font; font.setBold( isBold ); font.setUnderline( isUnderline ); label->setFont( font ); menu->setItemChecked( underlineID, isUnderline ); emit explain( "Options/Underline selected" ); } void MenuExample::about() { TQMessageBox::about( this, "TQt Menu Example", "This example demonstrates simple use of TQt menus.\n" "You can cut and paste lines from it to your own\n" "programs." ); } void MenuExample::aboutTQt() { TQMessageBox::aboutTQt( this, "TQt Menu Example" ); } void MenuExample::printer() { emit explain( "File/Printer/Print selected" ); } void MenuExample::file() { emit explain( "File/Printer/Print To File selected" ); } void MenuExample::fax() { emit explain( "File/Printer/Print To Fax selected" ); } void MenuExample::printerSetup() { emit explain( "File/Printer/Printer Setup selected" ); } void MenuExample::resizeEvent( TQResizeEvent * ) { label->setGeometry( 20, rect().center().y()-20, width()-40, 40 ); } int main( int argc, char ** argv ) { TQApplication a( argc, argv ); MenuExample m; m.setCaption("TQt Examples - Menus"); a.setMainWidget( &m ); m.show(); return a.exec(); }
See also Examples.
Copyright © 2007 Trolltech | Trademarks | TQt 3.3.8
|