Glade コンボボックスの攻略法 -- glade コンボをこのクラスで使用する方法
Glade コンボボックスの攻略法
ユーザインターフェイスを Glade でデザインするのは、
非常に便利で簡単です。しかし、このコンボでは独自のクラスを使用することができません。
Gtk2 の MVC モデルのおかげで、この強力なコンボを使用しつつ
内部では Gtk2_IndexedComboBox と同じモデルである
Gtk2_IndexedComboBox_Model を使用することができます。
例 46-1使用する Glade ファイル <?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
<glade-interface>
<widget class="GtkWindow" id="wndTest">
<property name="visible">True</property>
<property name="title" translatable="yes">Gtk2_IndexedComboBox_Model test</property>
<property name="type">GTK_WINDOW_TOPLEVEL</property>
<property name="window_position">GTK_WIN_POS_NONE</property>
<property name="modal">False</property>
<property name="resizable">True</property>
<property name="destroy_with_parent">False</property>
<property name="decorated">True</property>
<property name="skip_taskbar_hint">False</property>
<property name="skip_pager_hint">False</property>
<property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
<property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
<signal name="destroy" handler="Gtk::main_quit"/>
<child>
<widget class="GtkComboBox" id="cmbNormal">
<property name="visible">True</property>
</widget>
</child>
</widget>
</glade-interface> |
|
例 46-2PHP コード <?php
require_once 'Gtk2/IndexedComboBox/Model.php';
$glade = new GladeXML(dirname(__FILE__) . '/glade.glade');
$glade->signal_autoconnect();
$combo = $glade->get_widget('cmbNormal');
$combo->connect('changed', 'comboChanged');
//show the second column only
$renderer = new GtkCellRendererText();
$combo->pack_start($renderer);
$combo->set_attributes($renderer, 'text', 1);
$mod = new Gtk2_IndexedComboBox_Model();
$combo->set_model($mod);
$mod->append(1, 'One');
$mod->append_array(array(2 => 'Two', 3 => 'Three'));
$mod->prepend(4, 'Four');
function comboChanged($combo)
{
$nActive = $combo->get_active();
$iter = $combo->get_model()->get_iter($nActive);
$key = $combo->get_model()->get_key($iter);
$text = $combo->get_model()->get_text($iter);
echo 'Selected: ' . $key . ' => ' . $text . "\r\n";
}
Gtk::main();
?> |
|
注意すべき点は、自分でセルレンダラを設定し、
モデルのどのカラムを表示するのかを指定しなければならないということです。
それを除けば、あとは普通にモデルを作成し、それを
set_model() で設定するだけです。
これまでの例で見てきたすべての Gtk2_IndexedComboBox
のメソッドは、Gtk2_IndexedComboBox_Model
でも使用できます。しかし
get_active_key() と
get_active_text() だけはこのモデルでは使用できません。
なぜなら、このモデルは選択状態を知らないからです。選択されている
GtkTreeIter を取得するには、
get_active() と get_iter()
を組み合わせて使用し、この iter オブジェクトを
get_key() および get_text()
に渡します。