C 无法打开由glade创建的子窗口

C 无法打开由glade创建的子窗口,c,gtk,glade,C,Gtk,Glade,我是沼泽地的初学者 这是我的密码。我不知道为什么要跑步,但不能。 按下“添加”按钮时,将显示“添加”窗口。 我如何告诉glade我想要信号处理程序连接到哪个对象 谢谢你的建议 #include <gtk/gtk.h> typedef struct { GtkWidget *imagemenuitem1; GtkWidget *imagemenuitem5; GtkWidget *aboutdialog; GtkWidget *add; GtkWidget

我是沼泽地的初学者 这是我的密码。我不知道为什么要跑步,但不能。 按下“添加”按钮时,将显示“添加”窗口。 我如何告诉glade我想要信号处理程序连接到哪个对象

谢谢你的建议

 #include <gtk/gtk.h>
typedef struct 
{



  GtkWidget *imagemenuitem1;
  GtkWidget *imagemenuitem5;
  GtkWidget *aboutdialog;
  GtkWidget *add;
  GtkWidget *addwindow;
 }Data;

void open_add_window( GtkWidget *widget, Data *  data) 
{
  gtk_widget_show (data->addwindow );  
  gtk_widget_hide (data->addwindow);
}

    void quit_main_window(GtkWidget *widget, gpointer data)
{
  gtk_main_quit();
}

void open_about_window(GtkWidget *widget, Data *data)
{

 gtk_dialog_run(GTK_DIALOG(data->aboutdialog));
gtk_widget_hide(data->aboutdialog);
}
int
main( int    argc,
    char **argv )
{
  GtkBuilder *builder;
 GtkWidget  *window;
 Data data;
  GError     *error = NULL;
/* Init GTK+ */
gtk_init( &argc, &argv );

/* Create new GtkBuilder object */
builder = gtk_builder_new();
/* Load UI from file. If error occurs, report it and quit application.
 * Replace "tut.glade" with your saved project. */
if( ! gtk_builder_add_from_file( builder, "2.glade", &error ) )
{
    g_warning( "%s", error->message );
    g_free( error );
    return( 1 );
}

/* Get main window pointer from UI */
window = GTK_WIDGET( gtk_builder_get_object( builder, "window" ) );
data.imagemenuitem1 = GTK_WIDGET( gtk_builder_get_object( builder,"imagemenuitem1") );
data.imagemenuitem5 = GTK_WIDGET( gtk_builder_get_object( builder,"imagemenuitem5") );
data.aboutdialog = GTK_WIDGET( gtk_builder_get_object( builder, "aboutdialog"));
data.add = GTK_WIDGET ( gtk_builder_get_object( builder, "add"));
data.addwindow = GTK_WIDGET (gtk_builder_get_object( builder, "addwindow"));

/* Connect signals */
gtk_builder_connect_signals( builder, &data );


/* Destroy builder, since we don't need it anymore */
g_object_unref( G_OBJECT( builder ) );

/* Show window. All other widgets are automatically shown by GtkBuilder */
gtk_widget_show( window );

/* Start main loop */
gtk_main();

return( 0 );
“我不知道这是如何在纯香草C中工作的——你没有在你的帖子中贴上你使用的语言和GTK工具的标签,但是看起来你使用的是C++,而不是C++,所以我认为你没有GTKMM信号处理机制——如果这样,这个答案就没多大帮助了。虽然您可能可以在C中执行类似的操作:

我从不使用gtk_builder_connect_信号。你可以吗?通过使用GtkBuilder::get_小部件抓取所需的小部件来显式连接信号,如下所示:

Widget* w;
Builder->get_widget( widgetName, w );
这意味着您不需要在Glade中设置信号和处理程序,而需要在代码中进行设置—需要做更多的工作,但需要更好的控制和清晰度

一旦您按名称获取了小部件,您就可以使用static_cast来获取小部件实际所在的确切小部件类型的引用。这是必要的,因为每个特定的小部件类型都有自己的信号,所以需要获取特定的小部件类型。例如:

Button& button1 = static_cast < Button& > ( *w );
然后,将您抓取的小部件显式连接到所需的信号处理程序-下面是

关键调用是按钮。信号已单击。连接SIGC::ptr_fun&on_按钮已单击;-在这里,您可以精确地指定要连接的小部件:按钮;您正在获取的信号:单击信号;您希望为该信号调用什么函数:单击按钮

有关使用widget.connect的更多方法,请参阅上面的《开发人员指南》——对于自立信号处理程序、成员函数信号处理程序以及在调用信号处理程序时将参数传递给信号处理程序,有几种重载和变体

#include <gtkmm/button.h>

void on_button_clicked()
{
    std::cout << "Hello World" << std::endl;
}

main()
{
    Gtk::Button button("Hello World");
    button.signal_clicked().connect(sigc::ptr_fun(&on_button_clicked));
}