gpt4 book ai didi

c - 关于 g_signal_connect、g_cclosure_new、gpointer 的问题

转载 作者:太空宇宙 更新时间:2023-11-04 02:17:50 27 4
gpt4 key购买 nike

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

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