gtkmm テキストビュー プログラムに Ctrl+F アクセラレータを追加しようとしています。すでに検索機能を gtk Entry フィールドに実装しているので、必要なのは Ctrl+F が押されたときに検索エントリにフォーカスすることだけです。
私はググってgtkmmのチュートリアル/リファレンスをチェックしました(2.4、私はそれで作業しています)が、私が見つけた唯一のものはUIManagerを使用するメニューとツールバーとのコンテキストでのアクセラレータであり、私が使用する.ccファイルにはありません(それらを追加することはできません。既存のプログラムが原因です)。
ボタンに AccelKey を使用してアクションを追加しようとしたり、関数 add_accelerator() を試したりしましたが、適切に使用できませんでした (私は gtkmm にかなり慣れていないため、十分なサンプルがありません - 少なくとも私が理解できるものはありません) . ここで私が試したいくつかの例:
_gtkActionGroup->add(
Gtk::Action::create("find", "Find", "search in file"),
Gtk::AccelKey("<control>F"),
sigc::mem_fun(this, &SrcFilesView::onGtkTxtFindAccKeyPressed));
作成したボタン (ツールバー内) にこのアクションを追加する方法がわかりませんでした...
_gtkAccelGroup(Gtk::AccelGroup::create()) //initialized in the constructor of the class
...
_gtkBtnFind.add_accelerator("find", _gtkAccelGroup, GDK_Find,
Gdk::ModifierType::CONTROL_MASK, Gtk::ACCEL_VISIBLE);
ここで何かを試しましたが、ここに入力する必要があるパラメーターも、このメソッドがどのように機能するかもよくわかりませんでした-機能しませんでした...
誰かがこれがどのように適切に機能するかを説明してくれたら本当に嬉しいです。私の下手な英語を申し訳ありません. 必要なものがあれば教えてください。前もって感謝します
ご挨拶
編集: gtk ソースを調べて、add_accelerator のパラメーターを理解しようとしました。今私はこれを試しましたが、まだ動作しません...:
_gtkBtnFind.add_accelerator("clicked", _gtkAccelGroup, GDK_KEY_F /* or better GDK_KEY_f ?*/,
Gdk::ModifierType(GDK_CONTROL_MASK), Gtk::AccelFlags(GTK_ACCEL_VISIBLE));
_gtkBtnFind.signal_clicked().connect(
sigc::mem_fun(this, &SrcFilesView::onGtkTxtFindAccKeyPressed));
アップデート:
さて、私は今考えているほとんどのことを理解しており、なぜそれがうまくいかないのかを知っています. 問題は、accel_group をウィンドウ ウィジェットに追加する必要があることですが、プログラムでスクロールされたウィンドウとボックスしか取得できませんでした....そして、続行する方法がわかりません... :)
更新 2:
「on_key_press_event」ハンドラーを使用して状態とkeyvalパラメーターをチェックすることで、アクセラレーターなしでそれを行うことができました。これが少なくとも一部の人に役立つことを願っています^^。
bool on_key_press_event(GdkEventKey* event) { /* declaration in my constructor removed */
if(event->state == GDK_CONTROL_MASK && event->keyval == GDK_KEY_f
|| event->state == (GDK_CONTROL_MASK | GDK_LOCK_MASK)
&& event->keyval == GDK_KEY_F) {
_gtkEntFind.grab_focus();
}
return false;
}
アクセラレータを使用したソリューションがあれば、まだ興味があります。ご挨拶