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

时间:2014-05-26 02:33:08

标签: c gtk glade

我是Glade的初学者 这是我的代码。我不知道为什么关于dialog运行但是没有添加窗口。 当按下添加按钮时,将显示添加窗口。 我如何告诉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 );

}

1 个答案:

答案 0 :(得分:0)

免责声明: 我将gtkmm与C ++一起使用,所以我不确定这是如何在简单的香草C中实现的 - 你没有根据您正在使用的语言和GTK工具标记您的帖子,但看起来您使用的是C语言,而不是C ++,所以我认为您没有可用的gtkmm信号处理机制 - 如果是这样,这个答案就不会虽然你可以在C中做类似的事情,但是可以提供很多帮助:

我从不使用gtk_builder_connect_signals()。您可以(应该?)通过使用GtkBuilder::get_widget()抓取您想要的小部件来明确地连接信号,如下所示:

Widget* w;
Builder->get_widget( widgetName, w );

这意味着您没有在Glade中设置信号和处理程序,您可以在代码中进行设置 - 更多工作,但更好的控制和清晰度。

按名称获取小部件后,您可以使用static_cast<T&>()来获取小部件实际所在的确切小部件类型的引用。这是必要的,因为每个特定的窗口小部件类型都有自己的信号,因此您需要获取特定的窗口小部件类型。例如:

Button& button1 = static_cast < Button& > ( *w );

然后,将您明确抓取的小部件连接到所需的信号处理程序 - 这是Gnone Developer's Guide: Connecting signal handlers的示例

#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));
}

键调用是 button.signal_clicked()。connect(sigc :: ptr_fun(&amp; on_button_clicked)); - 您准确指定要连接的小部件:按钮;你抓住了什么信号: signal_clicked ;您希望为该信号调用什么函数: on_button_clicked

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