gtkmmでは四つの基本的なボタンを提供しています:
Gtk::Button.
標準的なボタンです。たいていはラベルか画像が貼ってあります。押すことがアクションの引き金となります。ボタンセクションを見てください。
Gtk::ToggleButton.
押すと戻る通常のボタンと違って、これはもう一度押すまで、へこんだままでいます。これはオン・オフスイッチに便利です。トグルボタンセクションを見てください。
Gtk::CheckButton.
これはトグルボタンと同じように振るまいますが、状態を横にラベルを置いた小さな四角で表します。これはオン・オフの設定が必要な場面で最も使われるべきでしょう。チェックボタンセクションを見てください。
Gtk::RadioButton.
古いカーラジオの選局ボタンから名づけられました。このボタンはグループの中で相互に排他的なオプションに使われます。ボタンのグループの中から一つを押すと、他のものは全てオフになります。小さなウィジットで側にラベルがあるという点でチェックボックスに似ていますが、ふつう見かけは異なります。ラジオボタンセクションを見てください。
覚えておいてください。GTK+のテーマ機能によりウィジットの外見は変わりえます。チェックボックスとラジオボタンの場合も、それらの見た目はかなり変わることがあります。
ボタンを生成するにはやり方がふたつあります。Gtk::Buttonコンストラクでラベル文字列を指定するものと、あとでset_label()で設定するものです。
キーボードによるアクセラレータを指定するには、ラベルの文字列の先頭にアンダースコアを打ち、オプションのmnemonicパラメータをtrueにしてください。例えば:
Gtk::Button* pButton = new Gtk::Button("_Something", true);
できるだけStockにあるアイテムを使ってください。そうすれば他のアプリケーションと一貫性を保つことができ、アイコンを使うことで見かけもずっといいものになります。例えば、
Gtk::Button* pButton = new Gtk::Button(Gtk::Stock::OK);
これで全ての言語で標準のラベル、キーボードアクセラレータ、アイコンを使うようになります。
Gtk::Buttonもまたコンテナですから、なにか他のウィジット、Gtk::Imageなどを中に置くことができます。
この例では画像とラベルを中に入れたボタンを生成しています。
File: buttons.h
#ifndef GTKMM_EXAMPLE_BUTTONS_H
#define GTKMM_EXAMPLE_BUTTONS_H
#include <gtkmm/window.h>
#include <gtkmm/button.h>
class Buttons : public Gtk::Window
{
public:
Buttons();
virtual ~Buttons();
protected:
//Signal handlers:
virtual void on_button_clicked();
//Child widgets:
Gtk::Button m_button;
};
#endif //GTKMM_EXAMPLE_BUTTONS_H
File: main.cc
#include <gtkmm/main.h>
#include "buttons.h"
int main(int argc, char *argv[])
{
Gtk::Main kit(argc, argv);
Buttons buttons;
//Shows the window and returns when it is closed.
Gtk::Main::run(buttons);
return 0;
}
File: buttons.cc
#include "buttons.h"
#include <iostream>
Buttons::Buttons()
{
m_button.add_pixlabel("info.xpm", "cool button");
set_title("Pixmap'd buttons!");
set_border_width(10);
m_button.signal_clicked().connect( sigc::mem_fun(*this,
&Buttons::on_button_clicked) );
add(m_button);
show_all_children();
}
Buttons::~Buttons()
{
}
void Buttons::on_button_clicked()
{
std::cout << "The Button was clicked." << std::endl;
}
覚えておいてください。XPMLabelBoxクラスはコンテナになれるウィジットの内部に、XPMファイルとラベルを配置するのに使われます。