Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在GTKTool按钮上接收滚动事件_C_Gtk_Gtk3 - Fatal编程技术网

C 在GTKTool按钮上接收滚动事件

C 在GTKTool按钮上接收滚动事件,c,gtk,gtk3,C,Gtk,Gtk3,是否有方法捕获GtkToolButton小部件上的滚动事件?根据我的尝试,我只能使用一个普通GtkToolItem中的常规按钮捕捉这些 下面是一个显示差异的最小示例: #include <gtk/gtk.h> #include <stdio.h> gboolean click_cb( GtkWidget* widget, GdkEvent* ev, gpointer window ) { gtk_widget_destroy(G

是否有方法捕获
GtkToolButton
小部件上的滚动事件?根据我的尝试,我只能使用一个普通
GtkToolItem
中的常规按钮捕捉这些

下面是一个显示差异的最小示例:

#include <gtk/gtk.h>
#include <stdio.h>

gboolean click_cb(
    GtkWidget* widget, 
    GdkEvent* ev, 
    gpointer window
    )
{
   gtk_widget_destroy(GTK_WIDGET(window))  ;
   return TRUE ;
}

gboolean scroll_cb(
    GtkWidget* widget, 
    GdkEventScroll* ev, 
    gpointer user_data
    )
{
    printf("scrolled %p\n", (void*) widget) ;
    return FALSE ;
}

void activate_cb(
    GtkApplication* app,
    gpointer        user_data
    )
{
  /* create the window */
  GtkWidget* window = gtk_application_window_new (app);
  gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
  printf("window is at %p\n", (void*) window) ;

  /* create a toolbar */
  GtkWidget* toolbar = gtk_toolbar_new() ;
  gtk_container_add(GTK_CONTAINER(window), toolbar) ;
  printf("toolbar is at %p\n", (void*) toolbar) ;

  /* create a tool button */
  GtkToolItem* tool_button = gtk_tool_button_new(NULL, NULL) ;
  gtk_toolbar_insert(GTK_TOOLBAR(toolbar), tool_button, -1) ;
  printf("tool button is at %p\n", (void*) tool_button) ;

  /* create an icon image */
  GtkWidget* button_icon = gtk_image_new_from_icon_name(
      "edit-copy", 
      GTK_ICON_SIZE_LARGE_TOOLBAR
      ) ;
  gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(tool_button), button_icon) ;

  /* create a generic toolbar item */
  GtkToolItem* generic_item = gtk_tool_item_new() ;
  gtk_toolbar_insert(GTK_TOOLBAR(toolbar), generic_item, -1) ;

  /* create a button */
  GtkWidget* button = gtk_button_new() ;
  gtk_container_add(GTK_CONTAINER(generic_item), button) ;
  printf("generic button is at %p\n", (void*) button) ;

  /* create an icon image */
  GtkWidget* generic_icon = gtk_image_new_from_icon_name(
      "edit-paste", 
      GTK_ICON_SIZE_LARGE_TOOLBAR
      ) ;
  gtk_button_set_image(GTK_BUTTON(button), generic_icon) ;


  /* signals */
  gtk_widget_add_events(GTK_WIDGET(tool_button), GDK_SCROLL_MASK);
  g_signal_connect(
      tool_button,
      "scroll-event",
      G_CALLBACK(scroll_cb),
      NULL
      ) ;

  gtk_widget_add_events(GTK_WIDGET(button), GDK_SCROLL_MASK);
  g_signal_connect(
      button,
      "scroll-event",
      G_CALLBACK(scroll_cb),
      NULL
      ) ;

  gtk_widget_add_events(GTK_WIDGET(toolbar), GDK_SCROLL_MASK);
  g_signal_connect(
      toolbar,
      "scroll-event",
      G_CALLBACK(scroll_cb),
      NULL
      ) ;

  gtk_widget_add_events(GTK_WIDGET(window), GDK_SCROLL_MASK);
  g_signal_connect(
      window,
      "scroll-event",
      G_CALLBACK(scroll_cb),
      NULL
      ) ;

  /* show all the elements */
  gtk_widget_show_all(window);
}

int main(int argc, char *argv[])
{
    GtkApplication *app = gtk_application_new (
        "org.gtk.scroll_test",
        G_APPLICATION_FLAGS_NONE
        ) ;
    g_signal_connect(app, "activate", G_CALLBACK(activate_cb), NULL);
    g_application_run (G_APPLICATION (app), 0, NULL) ;

    return 0;
}
对于示例输出,程序从以下内容开始:

window is at 0x13f8260
toolbar is at 0x149a1e0
tool button is at 0x15981e0
generic button is at 0x1599370
然后,当我滚动
GtkToolButton
时,我得到:

scrolled 0x13f8260
scrolled 0x13f8260
这意味着只有窗口接收事件,但在另一个按钮上:

scrolled 0x13f8260
scrolled 0x1599370
scrolled 0x149a1e0
scrolled 0x13f8260

显示现在工具栏和按钮都接收到事件。

不确定为什么要在工具按钮小部件上接收scoll事件,我甚至不确定这是否有效(尽管可能)。您是否尝试过使用toolbutton的单独回调来处理信号,并让处理程序返回true以停止事件?@EliasVanOotegem您所说的toolbutton的单独回调是什么意思?你是说在窗口处理信号吗?这个想法是当按钮被滚动时,它的图标被改变,相关数据被更新。您可以将其视为一个绘图应用程序,它可以绘制各种形状,每个形状都可以进行多次旋转。我希望每个形状使用一个按钮,并滚动按钮以选择其旋转。我的意思是,GtkToolButton小部件不支持AFAIK,但您可以通过将信号与停止事件的自定义回调挂钩来进行双重检查。。。PS:
printf(“滚动的%p\n”,小部件)应该是
printf(“滚动的%p\n”,(void*)小部件)->打印指针值是少数几个实际需要强制转换指针的情况之一,只是为了在所需的void强制转换上实现完整性:“(C11,7.21.6.1p8格式的输入/输出函数)参数应该是指向void的指针。”这主要是因为并非所有指针都保证大小相同(它们通常是相同的)(函数指针asside),但不能保证)@EliasVanOotegem关于
(void*)
的事情,我会解决的,谢谢。关于回调,我认为我的代码已经在尝试将回调挂接到小部件的信号上。GtkToolButton甚至阻止工具栏接收事件,而常规按钮没有。
scrolled 0x13f8260
scrolled 0x1599370
scrolled 0x149a1e0
scrolled 0x13f8260