The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

package LCDRange;
use Qt 2.0;
use Qt::signals 'valueChanged(int)';
use Qt::slots 'setValue(int)', 'setRange(int,int)', 'setText(string)';
@ISA = qw(Qt::Widget);
sub new {
my $text = (ref $_[1]) ? undef : splice(@_, 1, 1);
my $self = shift->SUPER::new(@_);
$self->init();
$self->setText($text) if $text;
return $self;
}
sub init {
my $self = shift;
my $lcd = Qt::LCDNumber->new(2, $self, 'lcd');
$lcd->move(0, 0);
my $sBar =
Qt::ScrollBar->new(0, 99, # range
1, 10, # line/page steps
0, # initial value
Qt::ScrollBar::Horizontal, # orientation
$self, 'scrollbar');
my $label = Qt::Label->new($self, 'label');
$label->setAlignment(Qt::AlignCenter);
$lcd->connect($sBar, 'valueChanged(int)', 'display(int)');
$self->connect($sBar, 'valueChanged(int)', 'valueChanged(int)');
@$self{'sBar', 'lcd', 'label'} = ($sBar, $lcd, $label);
}
sub value { return shift->{'sBar'}->value() }
sub text { return shift->{'label'}->text() }
sub setValue {
my $self = shift;
my $value = shift;
$self->{'sBar'}->setValue($value);
}
sub setRange {
my $self = shift;
my $minVal = shift;
my $maxVal = shift;
if($minVal < 0 || $maxVal > 99 || $minVal > $maxVal) {
warn "LCDRange::setRange($minVal, $maxVal)
Range must be 0..99
and minVal must not be greater than maxVal";
return;
}
$self->{'sBar'}->setRange($minVal, $maxVal);
}
sub setText {
my $self = shift;
my $text = shift;
$self->{'label'}->setText($text);
}
sub resizeEvent {
my $self = shift;
my($sBar, $lcd, $label) = @$self{'sBar', 'lcd', 'label'};
$lcd->resize($self->width(), $self->height() - 41 - 5);
$sBar->setGeometry(0, $lcd->height() + 5, $self->width(), 16);
$label->setGeometry(0, $lcd->height() + 16 + 5, $self->width(), 20);
}