我有 GTK GUI,它有一個控制按鈕,可以打開一個c_window在我的結構中呼叫的新視窗。c_window有一個退出按鈕,我需要連接到該c_quit功能。當我嘗試這樣做時,視窗不會終止,并且每次按下退出按鈕時都會出現警告:
(main_menu:2682): Gtk-CRITICAL **: 06:30:38.469: gtk_widget_destroy: assertion 'GTK_IS_WIDGET (widget)' failed
我的c_quit功能是:
static gboolean c_quit (gpointer userData)
{
message_details *details = (message_details *)userData;
gtk_widget_destroy (details->c_window);
return FALSE;
}
我如何從主連接它
g_signal_connect(G_OBJECT(details->c_quit), "clicked", G_CALLBACK (c_quit), details->c_window);
請注意,這details是我定義GtkWidget元素的結構。
uj5u.com熱心網友回復:
首先,你的信號連接函式是:
g_signal_connect(G_OBJECT(details->c_quit), "clicked", G_CALLBACK (c_quit), details->c_window);
其中包含不必要的演員陣容details->c_quit。此外,您正在傳遞指標的c_window欄位。details
接下來,您的回呼是:
static gboolean c_quit (gpointer userData)
{
message_details *details = (message_details *)userData;
gtk_widget_destroy (details->c_window);
return FALSE;
}
GtkButton::clicked信號回呼的簽名錯誤;正確的簽名是:
static void
c_quit (GtkButton *button, gpointer data)
此外,我建議為回呼使用正確的函式名稱,這樣您就可以輕松理解它的作用以及參考它的位置。例如,某事quit_button__clicked。
在您的回呼中,您使用錯誤的型別訪問錯誤的引數:
message_details *details = (message_details *)userData;
因為您沒有傳遞details資料,所以您傳遞的是指向視窗本身的指標。此外,gpointer是 的別名void*,并且 C 允許隱式轉換為void*; 這意味著您不需要在那里進行顯式轉換。
所以,回顧一下:
- 正確連接信號,使用正確的引數發送到您的回呼:
g_signal_connect (details->c_quit, "clicked",
G_CALLBACK (quit_button__clicked),
details);
- 為您要連接的信號使用正確的原型,并訪問正確的資料:
static void
quit_button__clicked (GtkButton *button G_GNUC_UNUSED,
gpointer user_data)
{
message_details *details = user_data;
gtk_widget_destroy (details->c_window);
}
如果您只想呼叫gtk_widget_destroy()視窗小部件以回應 aclicked上的信號GtkButton,您還可以將所有內容壓縮為一個呼叫:
g_signal_connect_swapped (details->c_quit, "clicked",
G_CALLBACK (gtk_widget_destroy),
details->c_window);
呼叫回呼時,該g_signal_connect_swapped()函式將交換信號的第一個和最后一個引數——第一個引數是發出信號的實體,最后一個引數是傳遞給連接函式的用戶資料。這意味著gtk_widget_destroy()將使用 的用戶資料引數呼叫g_signal_connect_swapped()。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/486956.html
上一篇:Unity-UI位置
下一篇:TabBar文本褪色
