ストックアイテムとショートカットキー
概要
ストックアイテムを使ってアクションを登録しショートカットキーの機能も実装する。閉じる、コピー、削除などの基本的なアクションはストックアイテム( 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`
結果
