リストビューにアイコンとテキストを同時表示する

概要

リストビューにアイコンとテキストを一つの列に同時表示する場合は手動で ビューの列クラス(Gtk::TreeViewColumn)を作ってTreeViewに登録し、 さらにpixbufとテキストのレンダリングクラス(Gtk::CellRendererPixbuf, Gtk::CellRendererText)を 作って作成したGtk::TreeViewColumnにパックする必要がある。さらにモデルの列を Gtk::TreeViewColumn::add_attribute()を使ってレンダリングクラスにマップする。

ソース

listview4.cpp
#include <gtkmm.h>

// 派生レコードクラス
class MyRecord : public Gtk::TreeModel::ColumnRecord
{

public:
    Gtk::TreeModelColumn< Glib::RefPtr< Gdk::Pixbuf > >  m_col_image;
    Gtk::TreeModelColumn< Glib::ustring > m_col_name;

    MyRecord(){

        // レコード( Gtk::TreeModel::ColumnRecord )に列( Gtk::TreeModelColumn )を登録
        add( m_col_image );
        add( m_col_name );
    }
};


/////////////////////


class MainWin : public Gtk::Window
{
    Gtk::ScrolledWindow m_scrwin;
    Gtk::TreeView m_treeview;

    MyRecord m_record;
    Glib::RefPtr< Gtk::ListStore > m_liststore;

public:
    MainWin();
};


MainWin::MainWin()
{
    // レコードを用いてモデル( Gtk::ListStore )作成
    m_liststore = Gtk::ListStore::create( m_record );

    // モデルをビュー( Gtk::TreeView )にセット
    m_treeview.set_model( m_liststore );

    // ビューの列クラス(Gtk::TreeViewColumn)を作ってTreeViewに登録
    Gtk::TreeViewColumn* viewcol = Gtk::manage( new Gtk::TreeViewColumn( "アイコン+名前" ) );
    m_treeview.append_column( *viewcol );

    // pixbufのレンダリングクラス(Gtk::CellRendererPixbuf)を作って
    // ビューの列クラス(Gtk::TreeViewColumn)にパック
    Gtk::CellRendererPixbuf* ren_pixbuf = Gtk::manage( new Gtk::CellRendererPixbuf() );
    viewcol->pack_start( *ren_pixbuf, false );
    // pixbufの実体が登録されているモデルの列を指定。0 はモデルの0列目(m_col_image)の意味
    viewcol->add_attribute( *ren_pixbuf, "pixbuf", 0 ); 

    // テキストレンダリングクラス(Gtk::CellRendererText)を作って
    // ビューの列クラス(Gtk::TreeViewColumn)にパック
    Gtk::CellRendererText* ren_text = Gtk::manage( new Gtk::CellRendererText() );
    viewcol->pack_start( *ren_text, true );
    // テキストの実体が登録されているモデルの列を指定。1 はモデルの1列目(m_col_text)の意味
    viewcol->add_attribute( *ren_text, "text", 1 ); 

    // モデルに行を追加するとビューの表示も同時に更新される
    Gtk::TreeModel::Row row;

    row = *( m_liststore->append() );
    // Gtk::Widget::render_icon()を使ってストックアイコンをレンダリングする
    row[ m_record.m_col_image ] = Gtk::Widget::render_icon( Gtk::Stock::YES, Gtk::ICON_SIZE_MENU );
    row[ m_record.m_col_name ] = "ほげ";

    row = *( m_liststore->append() );
    row[ m_record.m_col_image ] = Gtk::Widget::render_icon( Gtk::Stock::NO, Gtk::ICON_SIZE_MENU );
    row[ m_record.m_col_name ] = "あああ";

    // widgetのパック
    m_scrwin.add( m_treeview );
    add( m_scrwin );
    show_all_children();
    resize( 200,200 );
}


int main( int argc, char *argv[] )
{
    Gtk::Main kit( argc, argv );
    MainWin mainwin;
    Gtk::Main::run( mainwin );

    return 0;
}

コンパイル

必要なコンパイルオプションは pkg-config を使って取得する。

g++ listview4.cpp -o listview4 `pkg-config gtkmm-2.4 --cflags --libs`

結果