gpt4 book ai didi

gtk - 从 GtkSpinButton 移除滚动能力

转载 作者:行者123 更新时间:2023-12-02 17:51:31 25 4
gpt4 key购买 nike

我发现 GtkSpinButton 对于 GTK GUI 上的受控输入数字很有用。但是这里有一些 GTK 按钮的好特性,在许多情况下可能不需要。如果我们在 scrolledwindow 中有 GtkSpinButton 那么用户可能会不小心更改值,或者 GtkSpinButton 可以从 scrolledwindow 采取滚动行为。

问题:是否有可能使 GtkScrollButton 对鼠标滚轮不敏感,就像 GtkEntry 一样。或者更好的是,可以在没有向上/向下按钮的情况下显示 GtkSpinButton。如果不是,如何将滚动信号从 GtkSpinButton 重定向到滚动窗口?

我试试这个:

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...

但这只会“吃掉”来自 GtkSpinButton 的滚动信号并在适当的位置阻止滚动窗口。我最想要一些不干预每个 GtkSpinButton 事件的通用解决方案。

最佳答案

这里有一些关于您的查询的提示:

是否有可能使 GtkScrollButton 对鼠标滚轮不敏感,就像 GtkEntry 一样?
鼠标滚轮滚动、鼠标点击都是事件。事件可以被屏蔽。这可以在两个层面上完成。

  1. GtkWidget 级别:您可以使用 gtk_widget_get_events()这将以 GdkEventMask 的形式返回事件掩码.您可以根据需要修改它并使用 gtk_widget_set_events() 进行设置
  2. GdkWindow 级别:GtkWidget 有自己的绘图/事件区域有一个 GdkWindow与之相关。您可以使用 gdk_window_get_events() 获取此窗口的事件掩码并返回更改 GdkEventMask根据您的需要,使用 gdk_window_set_events() 将其设置为 GdkWindow .您可以通过按位操作修改事件掩码。如果 GdkWindow 在多个小部件之间共享,则此掩码将影响所有小部件。对于屏蔽滚动事件,您可以查看 GDK_SCROLL_MASKGDK_BUTTON_PRESS_MASKGDK_BUTTON_RELEASE_MASK。您可以随时检查您要查找的事件的掩码是否已设置。 注意:只有为GtkWidget创建了GdkWindow后,GdkWindow相关调用才会成功。您可以在小部件的 gtk_widget_show() 或包含这些小部件的窗口的 gtk_widget_show_all 之后进行这些调用。

或者更好的是,可以在没有向上/向下按钮的情况下显示 GtkSpinButton。
AFAIK GtkSpinButton 被实现为具有向上/向下按钮指示它提供的功能。如果你不想要这个,那么你可以选择另一个小部件,比如 GtkEntry(GtkSpinButton 是“derived”)或 GtkLabel。当然,您可以根据需要创建自己的小部件(从头开始或从现有 GtkWidget派生”)并使用它;没有人能阻止你这样做:)

如何将滚动信号从 GtkSpinButton 重定向到 scrolledwindow?
可以在 GtkSpinButton 的 "scroll-event" 回调中执行此操作。您可以停止在 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);
...

希望这对您有所帮助!

关于gtk - 从 GtkSpinButton 移除滚动能力,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7611813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com