#!/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();