【问题标题】:Get value on click点击获取价值
【发布时间】:2021-06-06 19:59:23
【问题描述】:

单击文本时需要获取一个值,但似乎由于某种原因,指针丢失并返回一个随机值,我想这样做:

static void click(GtkWidget* widget, long* click){
 cout << "Long value is: " << *click << endl;
}

int main(){
   gtk_init(0,0);
   //......... MORE CODE ......
   GtkWidget* label  = gtk_image_menu_item_new_with_label(text);
   long value = 50509;
   g_signal_connect(label, "button_press_event", G_CALLBACK(click), &value);
   //......... MORE CODE ......
   gtk_main();
}

(C++ 14) 有人可以帮帮我吗?

【问题讨论】:

  • 你从哪里得到click 的函数签名?检查the manual 以查看传递了哪些参数。你实际上是在使用event参数

标签: c++ c gtk gtk3


【解决方案1】:

我发现了错误,这很简单,当我在函数g_signal_connect中传递一个值时,它变成了一个gpointer,一个指针支持32位数据,而long消耗64位,我将long改为int工作完美! 解决方案:

static void click(GtkWidget *widget,GdkEvent  *event, gpointer  data){
 cout << "Int value is: " << GPOINTER_TO_INT(data) << endl;
}

int main(){
   gtk_init(0,0);
   //......... MORE CODE ......
   GtkWidget* label  = gtk_image_menu_item_new_with_label(text);
   int value = 50509;
   g_signal_connect(label, "button_press_event", G_CALLBACK(click), GINT_TO_POINTER(value));
   //......... MORE CODE ......
   gtk_main();
}

感谢@gerhardh 的评论。

【讨论】:

  • 为什么要传递一个整数作为指针?您仍然可以将其作为地址传递。您只需要将gpointer 转换为long *。使用 (long*)data 或 C++ 等效项。
  • @Gerhardh,我也试过了,但没有成功,它不断打破真正的价值,我找到的唯一解决方案是使用“int”。
  • 如果你使用GSIZE_TO_POINTER()GPOINTER_TO_SIZE() ?
猜你喜欢
  • 2016-07-04
  • 2015-03-23
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-14
相关资源
最近更新 更多