web-dev-qa-db-ja.com

Gtkでアクセラレータを使用する方法は?

Gtkを使用して、ユーザーが変更できるキーボードアクセラレータをサポートするアプリケーションをValaで作成する必要があります。

最初に、グローバルGtk.AccelMapにエントリを追加し、Gtk.MenuItemsのaccel_pathを設定します。しかし、それは機能しません。アクセルはメニューバーの項目に表示されません。私がやろうとしていることをクリアするために、ここにサンプルコードがあります:

// main.vala
public class MyWindow: Gtk.Window {
    public MyWindow() {
    this.set_default_size(500, 500);

    var main_box = new Gtk.VBox(false, 0);
    this.add(main_box);

    // Menubar
    var menubar = new Gtk.MenuBar();
    main_box.pack_start(menubar, false, false, 0);

    var file = new Gtk.MenuItem.with_label("File");
    menubar.add(file);

    var file_menu = new Gtk.Menu();
    file.set_submenu(file_menu);

    var quit_mi = new Gtk.MenuItem.with_label("Quit");
    file_menu.append(quit_mi);

    // Register a new accelerator with the global accelerator map
    Gtk.AccelMap.add_entry("<MyWindow>/File/Quit", 'Q', Gdk.ModifierType.CONTROL_MASK);
    quit_mi.set_accel_path("<MyWindow>/File/Quit");

    // Connect signals
    quit_mi.activate.connect(Gtk.main_quit);

    // Label
    var label = new Gtk.Label("My Window");
    main_box.pack_start(label, true, true, 0);

    this.destroy.connect(Gtk.main_quit);
    }
}

int main(string[] args) {
    Gtk.init(ref args);

    var win = new MyWindow();
    win.show_all();

    Gtk.main();
    return 0;
}

私が使う:

valac main.vala -o main --pkg gtk+-3.0

ソースコードをコンパイルします。

だから、質問は次のとおりです。コードには何が欠けていますか?私は何か他のことをする必要があると思うが、私は何を知らない。

7
LuisABOL

ニーモニック(GUIウィジェットのキーボードショートカット、つまりctrl-q)とアクセラレータ(メニュー項目をアクティブにするキーボードショートカット、つまりalt-f q)のどちらが必要かを明確にしてください。私が理解している限り、これらは2つの異なるものであるため、メニュー項目にニーモニックを設定してもアクセラレータは形成されません。

いずれにせよ、アクセラレータについては、異なる機能を使用してメニュー項目を作成するだけで作成できます:Gtk.MenuItem.with_mnemonic("_File");の代わりにGtk.MenuItem.with_label("File")。その後、例えばで再定義可能です。 file.set_label( 'Fil_e')関数

ニーモニックについては、valaがまったく初めてなので、なぜ機能しないのか正確にはわかりません。しかし、 this c-example のピギーバッグを作成し、アクセラレーターマップの代わりにアクセラレーターグループを使用して機能させることができました。だから私は置き換えた

// Register a new accelerator with the global accelerator map
Gtk.AccelMap.add_entry("<MyWindow>/File/Quit", 'Q', Gdk.ModifierType.CONTROL_MASK);
quit_mi.set_accel_path("<MyWindow>/File/Quit");enter code here

var accel_group = new Gtk.AccelGroup();
this.add_accel_group(accel_group);
quit_mi.add_accelerator("activate", accel_group, 'R', Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.VISIBLE);

そして、それはトリックを行うようです。

役に立てば幸いです。よろしくTLE

3
TLE