我有一個帶范圍的 gtk 比例尺,我的目標是捕捉用戶何時從比例尺上釋放點擊。(value-changed即使在滑塊仍在變化時也會呼叫,這就是為什么它在我的情況下沒有用)。所以我使用了這個信號。信號回呼正常作業,釋放滑鼠點擊時呼叫,問題是用戶指標有點隨機。并在每次通話時更改。這是我的代碼:
static gboolean callback(GtkWidget *widget, GdkEventButton event, gpointer data) {
int *n = (int *)data;
printf("Pointer: %p\n", n);
printf("Value: %d\n", *n);
return FALSE;
}
static void activate(GtkApplication *app, gpointer user_data) {
GtkWidget *window;
GtkWidget *button_box;
GtkWidget *slider;
int *n = malloc(sizeof(int));
*n = 1000;
printf("Initialized pointer: %p\n", n);
window = gtk_application_window_new(app);
gtk_window_set_title(GTK_WINDOW(window), "Window");
gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
button_box = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
gtk_container_add(GTK_CONTAINER(window), button_box);
gtk_widget_add_events(window, GDK_BUTTON_RELEASE_MASK);
slider = gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL, 0, 100, 1);
g_signal_connect(slider, "button-release-event", G_CALLBACK(callback), n);
gtk_container_add(GTK_CONTAINER(button_box), slider);
gtk_widget_show_all(window);
}
輸出是:
Initialized pointer: 0x5594c31e5de0
Pointer: 0x5594c30a3e40
Value: 7
Pointer: 0x5594c30a3e40
Value: 7
Pointer: 0x5594c30a3da0
Value: 7
Pointer: 0x5594c30a3b20
Value: 7
Pointer: 0x5594c30a3bc0
Value: 7
Pointer: 0x5594c30a3bc0
Value: 7
Pointer: 0x5594c30a3bc0
Value: 7
Pointer: 0x5594c30a3c60
Value: 7
如果我像這樣替換它也是同樣的n情況NULL:
g_signal_connect(slider, "button-release-event", G_CALLBACK(callback), NULL);
仍然在應該傳遞的時候傳遞隨機指標(nil)
這沒有任何意義。
編輯:唯一的混亂功能是主要的,這就是整個代碼:
int main(int argc, char **argv) {
GtkApplication *app;
int status;
app = gtk_application_new("org.gtk.example", G_APPLICATION_FLAGS_NONE);
g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
status = g_application_run(G_APPLICATION(app), argc, argv);
g_object_unref(app);
return status;
}
uj5u.com熱心網友回復:
我的主要懷疑是GdkEventButton event應該是GdkEventButton *event
在 C(和 Gtk)中將完整結構作為引數傳遞是非常罕見的
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/473134.html
上一篇:掃描二進制檔案中的病毒簽名
