销毁窗口,然后使按钮处于非活动状态

问题描述 投票:0回答:0

我正在尝试制作一个 GTK3 应用程序,它将有 3 个工具栏切换按钮,每个按钮都会打开一个新窗口,可以通过单击标题栏中的 X 或释放切换按钮来关闭该窗口,所以我在关闭后释放切换按钮时遇到问题从标题栏按 X 键打开窗口,

#include <gtk/gtk.h>

static void on_window_destroy(GtkWidget *widget, gpointer data) {
    GtkWidget *toggle_button = (GtkWidget *)data;
    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle_button), FALSE);
     GtkWidget **window_ptr = (GtkWidget **)data;
    *window_ptr = NULL;
}


static void on_button_clicked(GtkWidget * button, gpointer data) {
    
   static GtkWidget * window=NULL;
    if(window!=NULL)
        {
            gtk_widget_destroy(window);
        }
     else{
        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title(GTK_WINDOW(window), "window from button 1");
    gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
     g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(on_window_destroy), & window);

    gtk_widget_show_all(window);
     }   
}

static void on_button_clicked1(GtkWidget * button, gpointer data){
    static GtkWidget * window=NULL;
    if(window!=NULL)
        {
            gtk_widget_destroy(window);
        }
     else{
        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title(GTK_WINDOW(window), "window from button 2");
    gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(on_window_destroy), & window);

    gtk_widget_show_all(window);
     }   
}

static void on_button_clicked2(GtkWidget * button, gpointer data){
   static GtkWidget * window=NULL;
    if(window!=NULL)
        {
            gtk_widget_destroy(window);
        }
     else{
        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title(GTK_WINDOW(window), "window from button 3");
    gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);

    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(on_window_destroy), & window);

    gtk_widget_show_all(window);
     }   
}

int main(int argc, char * argv[]) {

  GtkWidget * window;
  GtkWidget * vbox;
  GtkWidget * image, * image1, * image2;
  GtkWidget * toolbar;
  GtkToolItem * btn1, * btn2, * btn3;

  gtk_init( & argc, & argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);
  gtk_window_set_title(GTK_WINDOW(window), "spooooon");
  gtk_widget_modify_bg(window, GTK_STATE_NORMAL, 0xffff);
  vbox = gtk_vbox_new(FALSE, 0);
  gtk_container_add(GTK_CONTAINER(window), vbox);
  g_signal_connect(G_OBJECT(window), "destroy",
    G_CALLBACK(gtk_main_quit), NULL);

  toolbar = gtk_toolbar_new();
  gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_BOTH);

  image = gtk_image_new_from_file("button.png");
  image1 = gtk_image_new_from_file("button2.png");
  image2 = gtk_image_new_from_file("button3.png");

  btn1 = gtk_toggle_tool_button_new();
  btn2 = gtk_toggle_tool_button_new();
  btn3 = gtk_toggle_tool_button_new();
  gtk_tool_button_set_label(btn1,"button1");
  gtk_tool_button_set_label(btn2,"button2");
  gtk_tool_button_set_label(btn3,"button3");
  gtk_tool_button_set_icon_widget(GTK_TOGGLE_TOOL_BUTTON(btn1), image);  
  gtk_tool_button_set_icon_widget(GTK_TOGGLE_TOOL_BUTTON(btn2), image1);  
  gtk_tool_button_set_icon_widget(GTK_TOGGLE_TOOL_BUTTON(btn3), image2);  
  g_signal_connect(btn1, "clicked", G_CALLBACK(on_button_clicked), NULL);
  g_signal_connect(btn2, "clicked", G_CALLBACK(on_button_clicked1), NULL);
  g_signal_connect(btn3, "clicked", G_CALLBACK(on_button_clicked2), NULL);
  gtk_toolbar_insert(GTK_TOOLBAR(toolbar), btn1, -1);
  gtk_toolbar_insert(GTK_TOOLBAR(toolbar), btn2, -1);
  gtk_toolbar_insert(GTK_TOOLBAR(toolbar), btn3, -1);

  gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 5);

  gtk_widget_show_all(window);

  gtk_main();

  return 0;
}


所以我认为问题是我无法使用我创建的窗口将信号发送到按钮 :)

如果你能帮助我,我将非常感激:)

我尝试使用 gtk_get_parent(window) 但它不起作用,因为 window 是顶层小部件。

c gtk gtk3
© www.soinside.com 2019 - 2024. All rights reserved.