リストビューの特定行、特定列の背景色を変更

概要

リストビューの特定行、特定列の背景色を変更する。

特定列の背景色を変えるだけならば前回のように直接ある列のレンダラを 取得して背景色のプロパティを変更するだけで良いが、特定行の背景色だけを変えたい場合は 実際に描画されるときに呼び出されるslot関数(SlotCellData)内で色を指定する。このslot関数をセットするには Gtk::TreeViewColumn::set_cell_data_func()を使用する。なおこの仕組みを利用すると描画時に動的に リストビューの内容も変更できるので便利である。下のサンプルでは3の倍数行の背景色と表示する文字 を動的に変更している。

ソース

listview6.cpp

#include <gtkmm.h>

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

    Gtk::TreeModelColumn< int > m_col_num;
    Gtk::TreeModelColumn< Glib::ustring > m_col_name;
    Gtk::TreeModel::ColumnRecord m_record;
    Glib::RefPtr< Gtk::ListStore > m_liststore;

public:
    MainWin();

private:
    void on_cell_data( Gtk::CellRenderer* cell, const Gtk::TreeModel::iterator& it );
};


MainWin::MainWin()
{
    // モデルとビューを作成
    m_record.add( m_col_num );
    m_record.add( m_col_name );
    m_liststore = Gtk::ListStore::create( m_record );
    m_treeview.set_model( m_liststore );

    // ビューに表示する列を指定
    m_treeview.append_column( "番号", m_col_num );
    m_treeview.append_column( "名前", m_col_name );

    // 描画時にセルに背景色をセットするように設定
    Gtk::CellRenderer* render = m_treeview.get_column_cell_renderer( 1 );
    if( render ) m_treeview.get_column( 1 )->set_cell_data_func( *render, sigc::mem_fun( *this, &MainWin::on_cell_data ) );

    // モデルに行を追加
    Gtk::TreeModel::Row row;
    for( int i = 0; i < 10; ++i ){
        row = *( m_liststore->append() );
        row[ m_col_num ] = i;
        row[ m_col_name ] = "ほげ";
    }

    m_scrwin.add( m_treeview );
    add( m_scrwin );
    show_all_children();
    resize( 200,200 );
}


//セルの描画時に呼び出されるslot関数
void MainWin::on_cell_data( Gtk::CellRenderer* cell, const Gtk::TreeModel::iterator& it )
{
    // 3の倍数行の背景色は青、それ以外は赤にする
    Gtk::TreeModel::Path path = m_liststore->get_path( it );
    if( ! ( path[ 0 ] % 3 ) ){
        cell->property_cell_background_gdk() = Gdk::Color( "blue" );

        // 文字も変える
        Gtk::TreeModel::Row row = *it;
        row[ m_col_name ] = "青";
    }
    else cell->property_cell_background_gdk() = Gdk::Color( "red" );
}


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

    return 0;
}

コンパイル

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

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

結果