【发布时间】:2009-10-21 03:22:38
【问题描述】:
我构建了一个复合小部件,并希望它有自己的加速器(热键),只有在它处于焦点时才可用。到目前为止,我唯一的想法是在我的小部件进出焦点时更改顶层的加速器组。看来应该有更好的办法。
【问题讨论】:
我构建了一个复合小部件,并希望它有自己的加速器(热键),只有在它处于焦点时才可用。到目前为止,我唯一的想法是在我的小部件进出焦点时更改顶层的加速器组。看来应该有更好的办法。
【问题讨论】:
每个小部件类都将指向其处理程序的指针作为小部件类结构的一部分公开。您可以在运行时修补它们,在调用 gtk_init() 之后但在进入应用程序的主循环之前。
例如,您可以像这样修补 GtkFoo 的按键处理程序:
static gboolean (*oldFooKeyPress)(GtkWidget* _widget, GdkEventKey* _event);
...
GtkWidgetClass* fooClass = GTK_WIDGET_CLASS(g_type_class_ref(GTK_TYPE_FOO));
oldFooKeyPress = fooClass->key_press_event;
fooClass->key_press_event = myFooKeyPress;
那么你可以这样写myFooKeyPress():
static gboolean myFooKeyPress(GtkWidget* widget, GdkEventKey* event)
{
if (widget is one I am interested in &&
event is a special accelerator for that widget)
{
do something special here
and maybe return
}
return oldFooKeyPress(widget, event);
}
我记得,当您进行上述修补时,如果 Foo 小部件类尚未初始化,则调用 GTK_TYPE_FOO 将对其进行初始化。
【讨论】:
看来我需要使用键绑定而不是加速键
http://library.gnome.org/devel/gtk/unstable/gtk-Bindings.html
GtkTextView 的交叉引用显示了如何 http://www.koders.com/c/fid959C3555A3004EA74AD6E0276122FC19673F9912.aspx?s=sort
【讨论】:
这是类初始化函数,这是我正在寻找的解决方案
static void
webview_class_init (WebviewClass *klass)
{
GtkObjectClass *object_class = GTK_OBJECT_CLASS (klass);
GtkBindingSet *binding_set;
signals[ZOOM_IN] = g_signal_new_class_handler("zoom_in",
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
G_CALLBACK (webview_zoom_in),
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 1,
G_TYPE_BOOLEAN, TRUE);
binding_set = gtk_binding_set_by_class (klass);
gtk_binding_entry_add_signal (binding_set, GDK_plus, GDK_CONTROL_MASK,
"zoom_in", 1,
G_TYPE_BOOLEAN, TRUE);
}
【讨论】:
请参阅 this 以了解仅为焦点小部件实现加速器
步骤:
GSimpleActionGroup 和gtk_widget_insert_action_group。 gtk_application_set_accels_for_action() 为该特定操作(名称)设置快捷方式。【讨论】: