簡體   English   中英

將多個參數傳遞給gtk回調函數

[英]passing multiple arguments to a gtk callback function

我試圖將多個參數傳遞給gtk回調函數,到目前為止我有以下代碼:

void add_new_set(GtkDialog *dialog, gint response_id, gpointer callback_params)
{
  g_print (gtk_entry_get_text (((struct data *) callback_params)->entry));
}

struct data callback_params;
    callback_params.entry = gtk_entry_new();
    gtk_container_add(GTK_CONTAINER(content_area), callback_params.entry);
    g_signal_connect(dialog,"response",G_CALLBACK (add_new_set),&callback_params);

什么也沒有得到g_print ed我得到以下錯誤:(tat:5918):Gtk-CRITICAL **:IA__gtk_entry_get_text:斷言'GTK_IS_ENTRY(entry)'失敗

(tat:5918):GLib-CRITICAL **:g_print:斷言'format!= NULL'失敗

我願意使用除傳遞結構指針以外的技術

謝謝

實際上,您實際上需要將復合數據打包在分配堆的 struct ,並將指針傳遞給回調。

struct data *cb_data = g_new0(struct data, 1);
cb_data->entry = gtk_entry_new();
cb_data->foo = "somefoo";
g_signal_connect(dialog,"response",G_CALLBACK (add_new_set), cb_data);

但是,您可能會只具有某個struct類型的單個static變量,然后將該變量的地址傳遞給您的回調。 這通常是不好的做法,我不建議這樣編碼(因為您希望回調以某種方式重新進入 )。

您不能使用局部變量的地址並將其傳遞給g_signal_connect (因為從函數返回后很長時間,GTK信號處理將使用該指針,因此會彈出其調用框架 )。

當然,問題是您的程序何時應釋放cb_data 也許考慮g_signal_connect_data ,它具有destroy_data關閉通知。 或連接其他信號來釋放數據(可能是小部件“破壞”對話框中的“關閉”您的dialog ....)。

您應該考慮使用valgrind調試內存泄漏

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM