Edited at

Rust で GTK::TreeView で value が表示されない(解決済み)

More than 1 year has passed since last update.


クソザコナメクジ編


なにをしようとしていたか

gtkにはTreeViewという以下のような表示レイアウトがある。

sample_treeview.png

(http://www.mono-project.com/docs/gui/gtksharp/widgets/treeview-tutorial/ より)

これを、Rustのgtk (https://github.com/gtk-rs/gtk) でやろうとした。


環境

rustc : 1.15.1

cargo : 0.16.0-nightly

gtk-rs: 0.1.1


起こったこと

上記のサンプルのカラムタイトル(Artist | Song Title)の部分は表示されたが、以下の内容が表示されない事態に陥った。

rust_treeview.png

(実際に実行した結果)

以上のようにvalueの部分が表示されなかった。

内部的には行(row)を追加して後から値(value)を入れるような形になっている。

そのため、行を追加する関数 insert, 行を追加すると同時に値を代入する関数 insert_with_valueで

行自体は追加されていることは確認できたのだが、valueは表示されなかった。


ソース


main.rs

extern crate gtk;

use gtk::prelude]]*;

fn main(){
gtk::init()
.expect("Failed to initialize GTK");

let mut mpd = mpd_query::get_mpd_socket(Ipv4Addr::new(127,0,0,1), 6600);
let window = gtk::Window::new(gtk::WindowType::Toplevel);

window.set_title("First");

window.set_border_width(10);
window.set_position(gtk::WindowPosition::Center);
window.set_default_size(350,70);

window.connect_delete_event(|_,_| {
gtk::main_quit();
Inhibit(false)
});

let column_types = [gtk::Type::String, gtk::Type::String];
let playlist_view = gtk::TreeView::new();
let playlist_store = gtk::ListStore::new(&column_types);

let title_column_num = 0;
let artist_column_num = 1;
let title_column = gtk::TreeViewColumn::new();
title_column.set_title("Title");
let artist_column = gtk::TreeViewColumn::new();
artist_column.set_title("Artist");

playlist_view.append_column(&title_column);
playlist_view.append_column(&artist_column);

// 行を追加してそのイテレータを取得
let iter = playlist_store.insert(-1);
// valueを代入
playlist_store.set_value(&iter, title_column_num, &"asd".to_value() as &gtk::Value);
playlist_store.set_value(&iter, artist_column_num, &"dsa".to_value() as &gtk::Value);

// 二行目
let iter = playlist_store.insert(-1);
playlist_store.set_value(&iter, title_column_num, &"Sample".to_value() as &gtk::Value);
playlist_store.set_value(&iter, artist_column_num, &"Elpmas".to_value() as &gtk::Value);

playlist_view.set_model(Some(&playlist_store));

window.add(&playlist_view);

window.show_all();
gtk::main();
}



おわりに

上記のソースコードはTreeViewウィジェットの概要 - Gtk::TreeView、Gtk::TreeModel、およびその関連クラスについてを参考にして実装している。

このページはrubyで書かれている。このプログラムを自分の環境で実際に動かしたところちゃんと動いた。

それを、Rustに書き直しただけなので動くと思うのだが、残念。

なにか、わかる方ぜひ教えてください。よろしくお願いします。


追記(解決編)


TreeViewとは


  • 単純にLayoutとかBoxとかContainer的なものの一種。なので当然、それ単体でテキストを表示したりしない。


使い方


  • 列のタイトルやそれぞれの列に入るデータを定義するのはTreeViewColumn

    let column_types   = [gtk::Type::String, gtk::Type::String];

let tree_view = gtk::TreeView::new();
let tree_store = gtk::ListStore::new(&column_types);

let column = gtk::TreeViewColumn::new();
let column_num = 0;
column.set_title("Title"); // 列のタイトルセット
// TreeViewのあるColumnのそれぞれのセル(行と列がクロスする部分)に表示するもの
let cell = gtk::CellRendererText::new();
// TreeViewのColumnの中にCellRendererを実際に追加
column.pack_start(&title_cell, true);
// TreeViewにはいくつかの属性(attribute)が存在し、テキストをレンダするための属性があるので追加
// その他の属性については http://www.pygtk.org/pygtk2reference/class-gtkcellrenderertext.html 参照
column.add_attribute(&title_cell, "text", column_num);

tree_view.append_column(column);

以上のようにして、Columnを設定しなければ表示しなければならない。


反省


  • rubyの方にもちゃんとCellRendererをちゃんと実装していた。

  • 冷静にソースを読もう。


参考文献