package Window;
use strict;
use warnings;
use QtCore4;
use QtGui4;
use QtSql4;
# [Window definition]
use QtCore4::isa qw( Qt::Widget );
use QtCore4::slots
updateButtons => ['int'];
# [Window definition]
# [Set up widgets]
sub NEW
{
my ($class, $parent) = @_;
$class->SUPER::NEW($parent);
this->setupModel();
this->{nameLabel} = Qt::Label(this->tr('Na&me:'));
this->{nameEdit} = Qt::LineEdit();
this->{addressLabel} = Qt::Label(this->tr('&Address:'));
this->{addressEdit} = Qt::TextEdit();
this->{typeLabel} = Qt::Label(this->tr('&Type:'));
this->{typeComboBox} = Qt::ComboBox();
this->{nextButton} = Qt::PushButton(this->tr('&Next'));
this->{previousButton} = Qt::PushButton(this->tr('&Previous'));
this->{nameLabel}->setBuddy(this->{nameEdit});
this->{addressLabel}->setBuddy(this->{addressEdit});
this->{typeLabel}->setBuddy(this->{typeComboBox});
# [Set up widgets]
# [Set up the mapper]
my $relModel = this->{model}->relationModel(this->{typeIndex});
this->{typeComboBox}->setModel($relModel);
this->{typeComboBox}->setModelColumn($relModel->fieldIndex('description'));
this->{mapper} = Qt::DataWidgetMapper(this);
this->{mapper}->setModel(this->{model});
this->{mapper}->setItemDelegate(Qt::SqlRelationalDelegate(this));
this->{mapper}->addMapping(this->{nameEdit}, this->{model}->fieldIndex('name'));
this->{mapper}->addMapping(this->{addressEdit}, this->{model}->fieldIndex('address'));
this->{mapper}->addMapping(this->{typeComboBox}, this->{typeIndex});
# [Set up the mapper]
# [Set up connections and layouts]
this->connect(this->{previousButton}, SIGNAL 'clicked()',
this->{mapper}, SLOT 'toPrevious()');
this->connect(this->{nextButton}, SIGNAL 'clicked()',
this->{mapper}, SLOT 'toNext()');
this->connect(this->{mapper}, SIGNAL 'currentIndexChanged(int)',
this, SLOT 'updateButtons(int)');
my $layout = Qt::GridLayout();
$layout->addWidget(this->{nameLabel}, 0, 0, 1, 1);
$layout->addWidget(this->{nameEdit}, 0, 1, 1, 1);
$layout->addWidget(this->{previousButton}, 0, 2, 1, 1);
$layout->addWidget(this->{addressLabel}, 1, 0, 1, 1);
$layout->addWidget(this->{addressEdit}, 1, 1, 2, 1);
$layout->addWidget(this->{nextButton}, 1, 2, 1, 1);
$layout->addWidget(this->{typeLabel}, 3, 0, 1, 1);
$layout->addWidget(this->{typeComboBox}, 3, 1, 1, 1);
this->setLayout($layout);
this->setWindowTitle(this->tr('SQL Widget Mapper'));
this->{mapper}->toFirst();
}
# [Set up connections and layouts]
# [Set up the main table]
sub setupModel
{
my $db = Qt::SqlDatabase::addDatabase('QSQLITE');
$db->setDatabaseName(':memory:');
if (!$db->open()) {
Qt::MessageBox::critical(undef, this->tr('Cannot open database'),
this->tr("Unable to establish a database connection.\n" .
'This example needs SQLite support. Please read ' .
'the Qt SQL driver documentation for information how ' .
'to build it.'), Qt::MessageBox::Cancel());
return;
}
my $query = Qt::SqlQuery();
$query->exec('create table person (id int primary key, ' .
'name varchar(20), address varchar(200), typeid int)');
$query->exec('insert into person values(1, \'Alice\', ' .
'\'123 Main Street
Market Town\', 101)');
$query->exec('insert into person values(2, \'Bob\', ' .
'\'PO Box 32
Mail Handling Service' .
'
Service City\', 102)');
$query->exec('insert into person values(3, \'Carol\', ' .
'\'The Lighthouse
Remote Island\', 103)');
$query->exec('insert into person values(4, \'Donald\', ' .
'\'47338 Park Avenue
Big City\', 101)');
$query->exec('insert into person values(5, \'Emma\', ' .
'\'Research Station
Base Camp
' .
'Big Mountain\', 103)');
# [Set up the main table]
# [Set up the address type table]
$query->exec('create table addresstype (id int, description varchar(20))');
$query->exec('insert into addresstype values(101, \'Home\')');
$query->exec('insert into addresstype values(102, \'Work\')');
$query->exec('insert into addresstype values(103, \'Other\')');
this->{model} = Qt::SqlRelationalTableModel(this);
this->{model}->setTable('person');
this->{model}->setEditStrategy(Qt::SqlTableModel::OnManualSubmit());
this->{typeIndex} = this->{model}->fieldIndex('typeid');
this->{model}->setRelation(this->{typeIndex},
Qt::SqlRelation('addresstype', 'id', 'description'));
this->{model}->select();
}
# [Set up the address type table]
# [Slot for updating the buttons]
sub updateButtons
{
my ($row) = @_;
this->{previousButton}->setEnabled($row > 0);
this->{nextButton}->setEnabled($row < this->{model}->rowCount() - 1);
}
# [Slot for updating the buttons]
1;