別のウィンドウを開くメニューのあるメインウィンドウがあります。このセカンダリウィンドウには、[閉じる]ボタンがあります。そのボタンには、クリックされた信号が接続されています。私の問題は、その親ウィンドウを閉じる/破棄する方法がわからないことです。gtk_widget_destroyを試してみましたが、ウィンドウがウィジェットではないためエラーが表示されます....親ウィンドウを破棄する関数が見つかりません...。
誰か教えてもらえますか?前もって感謝します。
-----------------------------------------------
Ok。コードを投稿します。プログラムを実行するとき、「ウィンドウを開く」ボタンをクリックします。「閉じる」ボタン1つで新しいウィンドウが開きます。「閉じる」ボタンをクリックすると、ターミナルで次のエラーが発生します:(Windows:13801):Gtk-CRITICAL **:gtk_widget_destroy:アサーション `GTK_IS_WIDGET(widget)'が失敗しました
コードは次のとおりです。
#include <stdlib.h>
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
void open_window(GtkWidget *widget, gpointer window);
void close_window(GtkWidget *widget, gpointer window);
int main( int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *fixed;
GtkWidget *button;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "Windows");
gtk_window_set_default_size(GTK_WINDOW(window), 230, 150);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
fixed = gtk_fixed_new();
gtk_container_add(GTK_CONTAINER(window), fixed);
button = gtk_button_new_with_label("Open window");
gtk_fixed_put(GTK_FIXED(fixed), button, 50, 50);
gtk_widget_set_size_request(button, 80, 35);
g_signal_connect(G_OBJECT(button), "clicked",
G_CALLBACK(open_window), G_OBJECT(window));
g_signal_connect_swapped(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
void open_window(GtkWidget *widget, gpointer window)
{
GtkBuilder *builder;
GtkWidget *secondWindow = NULL;
builder = gtk_builder_new ();
gtk_builder_add_from_file (builder, "secondWindow.glade", NULL);
secondWindow = GTK_WIDGET (gtk_builder_get_object (builder, "secondWindow"));
gtk_builder_connect_signals (builder, NULL);
g_object_unref (G_OBJECT (builder));
gtk_window_set_modal(GTK_WINDOW(secondWindow), TRUE);
gtk_widget_show_all(secondWindow);
}
void close_window(GtkWidget *widget, gpointer window)
{
gtk_widget_destroy(GTK_WIDGET(window));
}
ファイル「secondWindow.glade」では、ウィンドウ、テーブル、およびテーブルの中央のセルに配置されたボタンが定義されています。また、「close_window」という名前の「クリックされた」イベントボタンのハンドルも定義されています。
誰かがそれを実行したい場合は、gladeファイルへのリンク:https ://sites.google.com/site/marvalsiteimages/secondWindow.glade
これが私の問題を理解するのに役立つことを願っています。サンスク。
-------------------------------------------------
応答に基づく最終コード:
void open_window(GtkWidget *widget, gpointer window)
{
GtkBuilder *builder;
GtkWidget *secondWindow = NULL;
GtkWidget *closeButton = NULL;
builder = gtk_builder_new ();
gtk_builder_add_from_file (builder, "secondWindow.glade", NULL);
secondWindow = GTK_WIDGET (gtk_builder_get_object (builder, "secondWindow"));
closeButton = GTK_WIDGET (gtk_builder_get_object (builder, "closeWindowButton"));
g_signal_connect (G_OBJECT (closeButton),
"clicked",
G_CALLBACK (close_window),
G_OBJECT (secondWindow)); // here is the magic: the callback will get the window to close
g_object_unref (G_OBJECT (builder));
gtk_window_set_modal(GTK_WINDOW(secondWindow), TRUE);
gtk_widget_show_all(secondWindow);
}