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