The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w
package MenuExample;

use Qt 2.0;
import Qt::app;
use Qt::slots qw(
    open()
    news()
    save()
    closeDoc()
    undo()
    redo()
    normal()
    bold()
    underline()
    about()
    aboutQt()
    printer()
    file()
    fax()
    printerSetup()
);
use Qt::signals qw(explain(cstring));

@ISA = qw(Qt::Widget);

$p1_xpm = [
"16 16 3 1",
"       c None",
".      c #000000000000",
"X      c #FFFFFFFF0000",
"                ",
"                ",
"         ....   ",
"        .XXXX.  ",
" .............. ",
" .XXXXXXXXXXXX. ",
" .XXXXXXXXXXXX. ",
" .XXXXXXXXXXXX. ",
" .XXXXXXXXXXXX. ",
" .XXXXXXXXXXXX. ",
" .XXXXXXXXXXXX. ",
" .XXXXXXXXXXXX. ",
" .XXXXXXXXXXXX. ",
" .XXXXXXXXXXXX. ",
" .............. ",
"                "];

$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.    ",
"   .........    ",
"                ",
"                "];

$p3_xpm = [
"16 16 3 1",
"       c None",
".      c #000000000000",
"X      c #FFFFFFFFFFFF",
"                ",
"                ",
"   .........    ",
"  ...........   ",
"  ........ ..   ",
"  ...........   ",
"  ...........   ",
"  ...........   ",
"  ...........   ",
"  ...XXXXX...   ",
"  ...XXXXX...   ",
"  ...XXXXX...   ",
"  ...XXXXX...   ",
"   .........    ",
"                ",
"                "];

sub new {
    my $self = shift->SUPER::new(@_);
    my $p1 = Qt::Pixmap->new($p1_xpm);
    my $p2 = Qt::Pixmap->new($p2_xpm);
    my $p3 = Qt::Pixmap->new($p3_xpm);

    my $print = Qt::PopupMenu->new;
    $print->insertItem("&Print to printer", $self, 'printer()');
    $print->insertItem("Print to &file", $self, 'file()');
    $print->insertItem("Print to fa&x", $self, 'fax()');
    $print->insertSeparator();
    $print->insertItem("Printer &Setup", $self, 'printerSetup()');

    my $file = Qt::PopupMenu->new;
    $file->insertItem($p1, "&Open", $self, 'open()', Qt::CTRL+Qt::Key_O);
    $file->insertItem($p2, "&New", $self, 'news()', Qt::CTRL+Qt::Key_N);
    $file->insertItem($p3, "&Save", $self, 'save()', Qt::CTRL+Qt::Key_S);
    $file->insertItem("&Close", $self, 'closeDoc()', Qt::CTRL+Qt::Key_W);
    $file->insertSeparator();
    $file->insertItem("&Print", $print, Qt::CTRL+Qt::Key_P);
    $file->insertSeparator();
    $file->insertItem("E&xit", $app, 'quit()', Qt::CTRL+Qt::Key_Q);

    my $edit = Qt::PopupMenu->new;
    my $undoID = $edit->insertItem("&Undo", $self, 'undo()');
    my $redoID = $edit->insertItem("&Redo", $self, 'redo()');
    $edit->setItemEnabled($undoID, 0);
    $edit->setItemEnabled($redoID, 0);

    my $options = $self->{'options'} = Qt::PopupMenu->new;
    $options->insertItem("&Normal Font", $self, 'normal()');
    $options->insertSeparator();
    $self->{'boldID'} = $options->insertItem("&Bold", $self, 'bold()');
    $self->{'underlineID'} =
	$options->insertItem("&Underline", $self, 'underline()');
    $self->{'isBold'} = 0;
    $self->{'isUnderline'} = 0;
    $options->setCheckable(1);

    my $help = Qt::PopupMenu->new;
    $help->insertItem("&About", $self, 'about()', Qt::CTRL+Qt::Key_H);
    $help->insertItem("About &Qt", $self, 'aboutQt()');

    my $menu = $self->{'menu'} = Qt::MenuBar->new($self);
    $menu->insertItem("&File", $file);
    $menu->insertItem("&Edit", $edit);
    $menu->insertItem("&Options", $options);
    $menu->insertSeparator();
    $menu->insertItem("&Help", $help);
    $menu->setSeparator(Qt::MenuBar::InWindowsStyle);

    my $label = $self->{'label'} = Qt::Label->new($self);
    $label->setGeometry(20, $self->rect()->center()->y()-20,
			$self->width()-40, 40);
    $label->setFrameStyle(Qt::Frame::Box | Qt::Frame::Raised);
    $label->setLineWidth(1);
    $label->setAlignment(Qt::AlignCenter);

    $label->connect($self, 'explain(cstring)', 'setText(cstring)');

    $self->setMinimumSize(100, 80);

    return $self;
}

sub open {
    emit shift->explain("File/Open selected");
}

sub news {
    emit shift->explain("File/New selected");
}

sub save {
    emit shift->explain("File/Save selected");
}

sub closeDoc {
    emit shift->explain("File/Close selected");
}

sub undo {
    emit shift->explain("Edit/Undo selected");
}

sub redo {
    emit shift->explain("Edit/Redo selected");
}

sub normal {
    my $self = shift;
    my $options = $self->{'options'};
    $self->{'isBold'} = 0;
    $self->{'isUnderline'} = 0;
    $options->setItemChecked($self->{'boldID'}, 0);
    $options->setItemChecked($self->{'underlineID'}, 0);
    emit $self->explain("Options/Normal selected");
}

sub bold {
    my $self = shift;
    my $options = $self->{'options'};
    $self->{'isBold'} = !$self->{'isBold'};
    $options->setItemChecked($self->{'boldID'}, $self->{'isBold'});
    emit $self->explain("Options/Bold selected");
}

sub underline {
    my $self = shift;
    my $options = $self->{'options'};
    $self->{'isUnderline'} = !$self->{'isUnderline'};
    $options->setItemChecked($self->{'underlineID'}, $self->{'isUnderline'});
    emit $self->explain("Options/Underline selected");
}

sub about {
    Qt::MessageBox::about(shift, "PerlQt Menu Example",
			  "This example demonstrates simple use of Qt menus " .
			  "from PerlQt.\n" .
			  "You can cut and paste lines from it to your own " .
			  "programs.\n");
}

sub aboutQt {
    Qt::MessageBox::aboutQt(shift, "PerlQt Menu Example");
}

sub printer {
    emit shift->explain("File/Printer/Print selected");
}

sub file {
    emit shift->explain("File/Printer/Print To File selected");
}

sub fax {
    emit shift->explain("File/Printer/Print To Fax selected");
}

sub printerSetup {
    emit shift->explain("File/Printer/Printer Setup selected");
}

sub resizeEvent {
    my $self = shift;
    my $label = $self->{'label'};
    $label->setGeometry(20, $self->rect()->center()->y()-20,
			$self->width()-40, 40);
}

package main;

use Qt 2.0;
import Qt::app;

MenuExample::new("MenuExample");
$m = MenuExample->new;

$app->setMainWidget($m);
$m->show();
exit $app->exec();