2009-10-21 46 views
3

我创建了一个复合小部件,其中webkit_webview小部件存储在带有gtkvbox基本小部件的scrollwed窗口中。如果任何包含的小部件具有焦点,那么如何使基本gtkvbox小部件处于焦点状态?具体来说,我正在尝试添加只有在复合控件处于焦点时才处于活动状态的加速器。要确定复合控件是否处于焦点状态,我调用gtk_widget_get_focused(),然后遍历控件父项来查找基础控件。似乎应该有更好的方法。gtk复合小部件焦点

回答

1

一次只有一个小部件可以具有全局输入焦点,这是用户在屏幕上看到的焦点以及击键的出现位置。如果gtk_widget_has_focus(widget)返回TRUE那么widget具有全局输入焦点。您不能让webview和vbox同时拥有全局输入焦点。

你可以做的是在复合控件的父级上调用gtk_container_get_focus_child(),如果返回值是你的复合控件,那么焦点位于复合控件的某个位置。

或者您可以连接到复合小部件上的"focus-in-event""focus-out-event"信号。我相当肯定,当其中一个包含的小部件获得或失去焦点时,它们会通知您。 (请记得先在你的小部件上打电话gdk_window_set_events(widget->window, gdk_window_get_events(widget->window) | GDK_FOCUS_CHANGE_MASK),正如GTK文档中所解释的那样)。