我发现 GtkSpinButton 对于 GTK GUI 上的受控输入数字很有用。但是这里有一些 GTK 按钮的一些不错的功能,在许多情况下可能不需要。如果我们在 scrolledwindow 中有 GtkSpinButton,那么用户可能会意外更改值,或者 GtkSpinButton 可以从 scrolledwindow 获取滚动行为。
问题:这里有没有可能让 GtkScrollButton 对鼠标滚轮不敏感,就像 GtkEntry 一样。或者更好的是,可以在没有向上/向下按钮的情况下显示 GtkSpinButton。如果没有,如何将滚动信号从 GtkSpinButton 重定向到 scrolledwindow?
我试试这个:
SCROLL_numgreen (GtkObject *object, GdkEvent *event, gpointer user_data)
{
switch (((GdkEventScroll *)event)->direction)
{
case GDK_SCROLL_UP:
return TRUE;
break;
case GDK_SCROLL_DOWN:
return TRUE;
break;
... etc...
Run Code Online (Sandbox Code Playgroud)
但这只会“吃掉”来自 GtkSpinButton 的滚动信号并在适当的位置阻止 scrolledwindow。我最想要一些通用的解决方案,而无需干预每个 GtkSpinButton 的事件。
这里有一些指向您的查询的提示:
Is here any possibility to make GtkScrollButton insensible to mouse wheel, at way like is GtkEntry?
鼠标滚轮滚动,鼠标点击都是 事件。事件可以被屏蔽。这可以在两个层面上完成。
GtkWidget级别:您可以使用gtk_widget_get_events()which 将以GdkEventMask. 您可以根据需要修改它并使用gtk_widget_set_events()GdkWindow级别:GtkWidget有自己的绘图/事件区域有一个GdkWindow与之关联的。您可以使用 using 获取此窗口的事件掩码,gdk_window_get_events()并GdkEventMask根据需要返回更改并将其设置为GdkWindowusing gdk_window_set_events()。您可以通过按位操作修改事件掩码。如果GdkWindow在多个小部件之间共享,则此掩码将影响所有小部件。对于屏蔽滚动事件,您可以查看GDK_SCROLL_MASK, GDK_BUTTON_PRESS_MASK& GDK_BUTTON_RELEASE_MASK。您可以随时检查您要查找的事件的掩码是否已经设置。注意:GdkWindow相关调用只有在GdkWindow为GtkWidget. 您可以gtk_widget_show()在小部件之后进行这些调用,或者gtk_widget_show_all 包含这些小部件的窗口。Or better, could GtkSpinButton be shown without up/down buttons.
AFAIKGtkSpinButton被实现为具有指示其提供的功能的向上/向下按钮。如果您不想要这个,那么您可以选择另一个小部件 say GtkEntry(来自GtkSpinButton“派生”)或GtkLabel. 当然,您可以根据需要创建自己的小部件(从头开始或从现有的“派生” GtkWidget)并使用它;没有人阻止你这样做:)
How to redirect scroll signal from GtkSpinButton to scrolledwindow?
可以在"scroll-event"GtkSpinButton的回调中执行此操作。您可以停止发射信号GtkSpinButton并返回FALSE以传播事件。
...
/* Event callback */
gboolean spinbutton_scroll_handler(GtkWidget *widget, GdkEvent *event, gpointer user_data)
{
/* Stop emission on current widget. Default handler also not called */
/* Refer http://developer.gnome.org/gobject/stable/gobject-Signals.html#g-signal-stop-emission-by-name */
g_signal_stop_emission_by_name(widget, "scroll-event");
/* Return FALSE to propagate the event further; thus scroll window will scroll
If TRUE returned other handlers not invoked for this event,
thus no scroll on scroll window */
return FALSE;
}
...
/* Connect scroll-event to the callback */
g_signal_connect(spinbutton, "scroll-event",
G_CALLBACK(spinbutton_scroll_handler),
(gpointer)0);
...
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
1325 次 |
| 最近记录: |