- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
// gcc 1.c -o 0 $(pkg-config --cflags --libs gtk+-2.0)
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
struct tst
{
GtkWidget *win, *vb, *ent, *btn, *lbl;
GtkAccelGroup *acc;
GClosure *cls;
};
static void print_val(int nmb)
{
g_printf("%d\n", nmb);
}
static void window_new()
{
struct tst *prg = g_new0(struct tst, 1);
prg->win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
prg->vb = gtk_vbox_new(TRUE, 0);
prg->ent = gtk_entry_new();
prg->btn = gtk_button_new_with_label("Print!");
prg->lbl = gtk_label_new("Enter the string.");
prg->acc = gtk_accel_group_new();
int nmb = 140;
prg->cls = g_cclosure_new(G_CALLBACK(print_val), nmb, NULL);
gtk_container_add(GTK_CONTAINER(prg->win), GTK_WIDGET(prg->vb));
gtk_box_pack_start(GTK_BOX(prg->vb), GTK_WIDGET(prg->ent), FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(prg->vb), GTK_WIDGET(prg->btn), FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(prg->vb), GTK_WIDGET(prg->lbl), FALSE, FALSE, 0);
g_signal_connect(prg->win, "destroy", G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect(prg->btn, "clicked", G_CALLBACK(print_val), (gpointer)nmb);
gtk_window_set_title(GTK_WINDOW(prg->win), "Enter the string");
gtk_window_add_accel_group(GTK_WINDOW(prg->win), prg->acc);
gtk_accel_group_connect(prg->acc, GDK_KEY_P, (GDK_CONTROL_MASK | GDK_SHIFT_MASK), GTK_ACCEL_MASK, prg->cls);
gtk_widget_show_all(GTK_WIDGET(prg->win));
}
int main(int argc, char *argv[])
{
gtk_init(&argc, &argv);
window_new();
gtk_main();
return 0;
}
我想让这个程序在每次按下按钮或 Ctrl + Shift + P 时在控制台上打印 140。
但是当我按下按钮或 Ctrl + Shirt + P 时,这个程序打印出奇怪的值(不是 140)。
我该怎么办?
最佳答案
您的 print_val
回调需要有正确数量的参数。如果您在 GTK 文档中查找 GtkButton::clicked
信号,您将看到它具有以下签名:
void user_function (GtkButton *button, gpointer user_data)
所以当你点击按钮时传递给print_val
的第一个参数是按钮本身的地址。这是您要打印的“奇怪的值”。
与此处 Jens 的回答相反,GLib 确实提供了一种将 int
转换为指针的可移植方式。所以为了实现你想要的,你需要像这样连接你的信号:
g_signal_connect(prg->btn, "clicked", G_CALLBACK(print_val), GINT_TO_POINTER(nmb));
然后像这样进行回调:
static void print_val(GtkButton *button, gpointer nmb)
{
g_printf("%d\n", GPOINTER_TO_INT(nmb));
}
关于c - 关于 g_signal_connect、g_cclosure_new、gpointer 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4774810/
我正在尝试编译一些代码,但出现以下错误: error: invalid use of member (did you forget the ‘&’ ?) 这是来自 g_signal_connect 调
我正在尝试连接一个对象以销毁一个小部件,但什么也没有发生,而且我收到了一个错误 调用如下: g_signal_connect(bKill, "clicked", G_CALLBACK(AppWindo
我得到的代码适用于鼠标左键单击按钮,但我将如何使用它来获取鼠标右键单击信号: g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(butt
根据 GObject 引用 g_signal_connect_swapped(instance, detailed_signal, c_handler, data); connects a GCall
通过 g_signal connect,我尝试使用“数据”字段传递一个简单字符“S”的参数。 ???(我想我明白该字段不是用于数据的,而是用于指向数据的指针。)??? 无论如何,我有这样的代码: g_
我使用 gtk 创建了一个窗口。然后我想向按钮添加点击事件。我尝试了几种方法但没有成功 #if GTK_CHECK_VERSION(3,0,0) GtkBuilder* builder = n
我有这段代码: int gui_showScore(struct Game *game) { printf("%p\n", game); return NO_ERROR; } int
我已经创建了一个用于创建 gtk 主窗口的简单类。 我想知道将类成员函数作为参数传递给 G_CALLBACK 函数的正确方法是什么? 为什么 g_signal_connect(button, "cli
无法让 g_signal_connect 正确传递参数。可能是因为我不理解“c_handler”或“data”参数。代码在这里: #include // Function prototypes vo
我正在尝试学习如何在 gstreamer 中使用动态垫。因此,我尝试添加填充添加信号,以便在创建元素后我可以收到消息。但是,我没有收到任何消息。 这是代码: #include static void
我正在尝试在我的项目中使用 Glade 来生成一个包含窗口、网格的文件……但是当我尝试监听单击我的按钮的事件时,我遇到了一个错误,我不明白为什么 :s 我遇到了那些错误.. GLib-GObject
我正在阅读 GStreamer 应用程序开发人员手册,它在消息处理/事件处理的上下文中讨论了管道总线,他们讨论了 2 个函数:gst_bus_add_watch() 和 g_signal_connec
刚开始接触GTK+编程,一个星期以来我主要遇到了一个大问题,这里代码解释一下: for(j=1;ji); } 我通常应该得到我用 a.i=i 初始化的 i;因为我没有得到 i 和 j 的 requie
我试图找到一个类似的问题,但找不到任何解决方案。 我有一个使用 GTK3 用 C 语言编写的软件,我正在尝试为在我的 GUI 上按下按钮设置一个回调。该代码应该传递一个整数作为参数,让我的回调函数知道
所以,我正在努力实现以下目标: 用户正在选择文件,该文件的路径保存在变量文件名中。选择文件后,用户通过复选框选择要设置的 chmod。 我有这样的东西: g_signal_connect (ux, "
// gcc 1.c -o 0 $(pkg-config --cflags --libs gtk+-2.0) #include #include struct tst { GtkWidge
我正在尝试通过 g_signal_connect 传递堆中分配的数据,但它显示出一些奇怪的行为。 我是这样传递值的: int *test = new int(100); g_signal_connec
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 Improve th
g_signal_connect() 需要一个 gpointer、一个字符常量、一个 GCallback 和另一个 gpointer 作为参数. 我正在阅读 Foundations of GTK+ 这
我看过GTK+ g_pointer_connect passing data incorrectly但即使在尝试按照人们所说的去做之后,我的问题仍然存在。 我需要做的是从数组数组中传递一个数组。 声明
我是一名优秀的程序员,十分优秀!