ストックアイテムとショートカットキー
概要
ストックアイテムを使ってアクションを登録しショートカットキーの機能も実装する。閉じる、コピー、削除などの基本的なアクションはストックアイテム( Gtk::Stock )としてデフォルトで 用意されている。これらのストックアイテムにはアイコンが割り当てられており、更に add_accel_group() に よってアクセレータを登録するとショートカットキーの使用も可能になる。下の例では Quit と Copy アイテムを使用しており、 Ctrl+q, Ctrl+c を押すとそれぞれに対応したシグナルハンドラが呼ばれる。
ソース
shortcut.cpp
#include <gtkmm.h>
#include <iostream>
class MainWin : public Gtk::Window
{
Gtk::VBox m_box;
Glib::RefPtr< Gtk::ActionGroup > m_actiongroup;
Glib::RefPtr< Gtk::UIManager > m_uimanager;
public:
MainWin();
private:
void on_menu_quit();
void on_menu_copy();
};
MainWin::MainWin()
{
// OFFになってるイベントを追加
add_events( Gdk::BUTTON_PRESS_MASK );
// アクショングループの作成とアクション登録
m_actiongroup = Gtk::ActionGroup::create();
// メニューのラベル
m_actiongroup->add( Gtk::Action::create( "MenuTitle", "メニュー" ) );
// アクション
m_actiongroup->add( Gtk::Action::create( "MenuQuit", Gtk::Stock::QUIT ), sigc::mem_fun( *this, &MainWin::on_menu_quit ) );
m_actiongroup->add( Gtk::Action::create( "MenuCopy", Gtk::Stock::COPY ), sigc::mem_fun( *this, &MainWin::on_menu_copy ) );
// UIマネージャの作成とアクショングループ挿入
m_uimanager = Gtk::UIManager::create();
m_uimanager->insert_action_group( m_actiongroup );
// ショートカットキー(アクセレータ)登録
add_accel_group( m_uimanager->get_accel_group() );
// メニューのレイアウト
try
{
Glib::ustring ui_info =
"<ui>"
"<menubar name='MenuBar'>"
" <menu action='MenuTitle'>"
" <menuitem action='MenuQuit'/>"
" <menuitem action='MenuCopy'/>"
" </menu>"
"</menubar>"
"</ui>";
m_uimanager->add_ui_from_string(ui_info);
}
catch(const Glib::Error& err )
{
std::cout << err.what() << std::endl;
}
// メニューのパック
resize( 300, 300 );
add( m_box );
Gtk::Widget* menubar = m_uimanager->get_widget( "/MenuBar" );
m_box.pack_start( *menubar, Gtk::PACK_SHRINK );
show_all_children();
}
// シグナルハンドラ
void MainWin::on_menu_quit()
{
std::cout << "quit\n";
}
// シグナルハンドラ
void MainWin::on_menu_copy()
{
std::cout << "copy\n";
}
int main( int argc, char *argv[] )
{
Gtk::Main kit( argc, argv );
MainWin mainwin;
Gtk::Main::run( mainwin );
return 0;
}
コンパイル
必要なコンパイルオプションは pkg-config を使って取得する。g++ shortcut.cpp -o shortcut `pkg-config gtkmm-2.4 --cflags --libs`
結果