ストックアイテムとショートカットキー

概要

ストックアイテムを使ってアクションを登録しショートカットキーの機能も実装する。

閉じる、コピー、削除などの基本的なアクションはストックアイテム( 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`

結果