5

別のウィンドウを開くメニューのあるメインウィンドウがあります。このセカンダリウィンドウには、[閉じる]ボタンがあります。そのボタンには、クリックされた信号が接続されています。私の問題は、その親ウィンドウを閉じる/破棄する方法がわからないことです。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);
}
4

1 に答える 1

5

あなたの問題は、2番目のウィンドウのボタンの「クリックされた」信号が空き地ファイルから接続されていることです。ただし、シグナルハンドラは、ウィンドウを破棄するためにウィンドウへのポインタを必要とします。これは、シグナルコールバックの「user_data」パラメータを介して渡されます。

1つの方法は、2番目のウィンドウをGladeのuser_data引数として渡すことです(このGladeチュートリアルを参照してください)が、引数はポインターであると想定されており、gladeでそれを行う方法がわかりません。編集:空き地でこの信号に関連付けられているユーザーデータフィールドをクリックするだけで、ポップアップが表示され、信号ハンドラーに渡すオブジェクトを選択できます。「secondWindow」オブジェクトを選択するだけです。

別の方法は、グレイドファイルからシグナル処理を削除し、クリックしたシグナルをコードから手動で接続して、ユーザーデータとして2番目のウィンドウへのポインターを渡すことです。

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);
}
于 2012-09-28T16:02:01.127 に答える