18 мая 2009 г.

Несколько виджетов в окне. Часть 3. GtkTable().

Продолжаем разговор о контейнерах. Сегодня речь пойдёт о таблице GtkTabel(). Она представляет из себя двумерную сетку, т.е. имеется возможность распологать виджеты как в вертикальном, так и в горизонтальном направлениях. Похожего эффекта можно добиться используя вложенные GtkVBox() и GtkHBox(), но таблица является более простой в использовании.

Создаётся таблица так:
$table = new GtkTable();

Для добавления в таблицу виджетов используется метод attach(). Первым параметром ему передаётся добавляемый виджет. Второй и третий параметры указывают, в каких ячейках по горизонтали будет располагаться виджет. Четвёртый и пятый - по вертикали. Причём, указываются не сами ячейки, а промежутки между ними. Отсчёт ведётся с нуля. Для удобства восприятия приведу небольшой набросок нашей сегодняшней программы, тогда вам всё станет понятно:



Добавляем виджеты:
$table->attach(new GtkLabel('Строка 1'), 0, 1, 0, 1);
$table->attach(new GtkLabel('Строка 2'), 1, 2, 0, 1);
$table->attach(new GtkLabel('Строка 3'), 0, 2, 1, 2);
Как видите, "Строка 3" растянута на две ячейки по горизонтали.

Теперь остаётся только создать окно и добавить в него таблицу, но это вы уже умеете.

Как всегда, в конце статьи привожу скриншот получившейся программы и полный её код:

<?php
 
$table = new GtkTable();
 
$table->attach(new GtkLabel('Строка 1'), 0, 1, 0, 1);
$table->attach(new GtkLabel('Строка 2'), 1, 2, 0, 1);
$table->attach(new GtkLabel('Строка 3'), 0, 2, 1, 2);
 
$window = new GtkWindow();
$window->connect_simple('destroy', array('Gtk', 'main_quit'));
$window->set_size_request(300, 150);
$window->add($table);
$window->show_all();
Gtk::main();
 
?>

6 комментариев:

Анонимный комментирует...

Отличный блог для новичков, продолжай 5 баллов.

З.Ы.
Было бы полезно про обработку сигналов почитать.

Shecspi комментирует...

Как раз в следующей статье собирался описать такие виджеты, как кнопки, поля ввода, переключатели и соответствующие им сигналы.

Dmitry комментирует...

как я понял 2 контейнера нельзя поместить одновременно в окно?
получилось только поместить контейнер в контейнер:

$vbox->pack_start($table, FALSE, FALSE);
($vbox - из пред. примера)

Shecspi комментирует...

Дмитрий, для того, чтобы поместить 2 контейнера в окно необходимо создать третий, в него поместить первые два, и добавить его в окно методом add().

Dmitry комментирует...

Большое спасибо, разобрался.

Dmitriy комментирует...

А возможно задать ширину/высоту ячейки?