#!./perl -w
use Qt 2.0;
use Event;
package Qt::Application;
BEGIN { Qt::app->import; } # must happen prior to this override:
{
# Won't work unless these are *virtual* functions. Troll Tech
# hasn't yet seen fit to make this change. Apply the attached
# patch for qt, and recompile.
# Don't forget to make similar adjustments to the PerlQt templates.
no warnings;
sub enter_loop { Event::loop() }
sub exit_loop { Event::unloop() }
}
package MyMainWindow;
use base 'Qt::MainWindow';
use Qt::slots 'open_file()';
sub open_file {
# call something that does exec(), and therefore enter_loop()
Qt::FileDialog::getExistingDirectory();
}
use Qt::slots 'quit()';
sub quit { Event::unloop(0) }
package main;
Qt::app->import;
# Some versions of PerlQt don't provide xfd(). Fortunately, it is
# easy to add.
#
# Qt.pig:
#
# #include <qwindefs.h>
# #include <X11/Xlib.h>
# static int xfd() : ConnectionNumber(qt_xdisplay());
Event->io(desc => 'Qt',
fd => Qt::xfd(),
timeout => .2, # for balloon help, etc.
cb => sub {
$app->processEvents(3000); #read
$app->flushX(); #write
});
my $w = MyMainWindow->new;
my $mb = $w->menuBar;
my $file = Qt::PopupMenu->new;
$file->insertItem("Open...", $w, 'open_file()');
$file->insertItem("Quit", $w, 'quit()');
$mb->insertItem("File", $file);
my $at = int rand 1000;
my $label = Qt::Label->new("$at", $w);
$w->setCentralWidget($label);
Event->timer(hard => 1, interval => .2, cb => sub {
--$at;
$at = int rand 1000
if $at < 1;
# prove that Event is in control
$label->setText($at);
});
$w->resize(200, 200);
$w->show;
$app->setMainWidget($w);
exit Event::loop();
__END__
diff -c 'qt-2.1.0/src/kernel/qapplication.h' 'qt-2.1.0.new/src/kernel/qapplication.h'
*** ././src/kernel/qapplication.h Wed Apr 12 09:21:53 2000
--- ././src/kernel/qapplication.h Wed Apr 12 13:53:51 2000
***************
*** 112,119 ****
void processEvents();
void processEvents( int maxtime );
void processOneEvent();
! int enter_loop();
! void exit_loop();
int loopLevel() const;
static void exit( int retcode=0 );
--- 112,119 ----
void processEvents();
void processEvents( int maxtime );
void processOneEvent();
! virtual int enter_loop();
! virtual void exit_loop();
int loopLevel() const;
static void exit( int retcode=0 );