スピンボタン

概要

Gtk::SpinButtonによってスピンボタンを作成する。

基本的には

・SpinButton::set_range() で範囲をセット
・SpinButton::set_increments() で変化量をセット
・SpinButton::set_value() で初期値をセット

するだけで良いが、gtkmmのバージョンが2.4の場合は 上下の矢印ボタンを押しても値が変化しないというバグ(?)がある。 よってgtkmm2.4の場合は SpinButton::on_spinbutton_digits_changed() を オーバロードして自前で値をセットする必要がある。

ソース

spin.cpp ( gtkmm2.5 以降 )
#include <gtkmm.h>

class MainWin : public Gtk::Window
{
    Gtk::SpinButton m_spin;

public:
    MainWin();
};


MainWin::MainWin()
{
    m_spin.set_range( 1, 5 );
    m_spin.set_increments( 1, 1 );
    m_spin.set_value( 2 );

    add( m_spin );
    show_all_children();
}

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

    return 0;
}
spin.cpp ( gtkmm2.4 用)
#include <gtkmm.h>
#include <sstream>

class MySpinButton : public Gtk::SpinButton
{
public:
    MySpinButton() : Gtk::SpinButton(){}

protected:

    // gtkmm2.4の場合は値が変わったら自前でテキストをセットする
    // 必要がある( gtkmm2.4 のバグ? )
    virtual void on_spinbutton_digits_changed()
    {
        std::stringstream ss;
        ss << (int)get_value();
        set_text( ss.str() );
    }
};


class MainWin : public Gtk::Window
{
    MySpinButton m_spin;

public:
    MainWin();
};


MainWin::MainWin()
{
    m_spin.set_range( 1, 5 );
    m_spin.set_increments( 1, 1 );
    m_spin.set_value( 2 );

    add( m_spin );
    show_all_children();
}


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

    return 0;
}

コンパイル

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

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

結果