【问题标题】:Glade Interface Designer: could not find signal handlerGlade Interface Designer:找不到信号处理程序
【发布时间】:2015-08-19 09:26:27
【问题描述】:

我是 GTK 的新手。我在使用 Glade Interface Designer 设计 UI 时遇到了这样的问题。 我的目的是设计两个窗口。main_window 中的一个按钮控制 create_log_in_window 的外观。 我在 Glade 中添加了函数“create_log_in_window”和对象“main_window”。 但是,当我运行程序时,该按钮无效。而这样的警告正在出现。 以下是代码和警告:

Gtk-WARNING:在“create_log_in_window”中找不到信号处理程序

#include <gtk/gtk.h>
int main (int argc, char *argv[]){

    GtkBuilder      *builder;
    GtkWidget       *main_window;

    gtk_init (&argc, &argv);

    builder = gtk_builder_new();
    gtk_builder_add_from_file(builder,"main_window.glade", NULL);
    main_window = GTK_WIDGET(gtk_builder_get_object(builder, "main_window"));
    gtk_builder_connect_signals(builder, NULL);
    g_object_unref(G_OBJECT(builder));

    gtk_widget_show_all(main_window);
    gtk_main();

    return 0;
}

gboolean create_log_in_window(GtkWidget *main_window){

    GtkBuilder *builder;
    GtkWidget  *window;

    gtk_widget_hide_all(main_window);

    builder = gtk_builder_new();
    gtk_builder_add_from_file(builder,"log_in_window.glade",NULL);
    window = GTK_WIDGET(gtk_builder_get_object(builder,"log_in_window"));
    gtk_builder_connect_signals(builder,NULL);
    g_object_unref(G_OBJECT(builder));

    gtk_widget_show_all(window);
    return true;
}

【问题讨论】:

  • 如果我没记错的话,c++ builder 不支持 glade 中定义的信号。您将不得不用 C++ 手动编写它们。这个缺陷似乎被stackoverflow.com/questions/4089077/…确认了
  • 您尝试将create_log_in_window() 连接到哪个小部件的什么信号?您是否检查过您的函数签名对于该信号是否正确?
  • 我在按钮中使用了“点击”信号来连接 create_log_in_window().@jku
  • 感谢您的帮助。但是当我将按钮连接到 gtk_main_quit() 函数时它可以工作。我将尝试手动编写信号然后进行检查。 @CaptainGiraffe

标签: c++ gtk glade


【解决方案1】:

参考了很多资料,终于在这个网站找到了一些有用的东西:http://blog.csdn.net/xuesen_lin/article/details/6001114 关键是我们应该以特殊的方式定义我们的函数,以便让盘子找到函数地址。 也许我的描述不清楚。所以我会展示我的代码。

#include <gtk/gtk.h>

typedef struct _MainDate{

    GtkWidget *main_window;
    GtkWidget *delete_button;

}MainDate;


G_MODULE_EXPORT void delete_confirm_window( GtkButton *button, GtkWidget *popup ){

    GtkBuilder *builder;
    GtkWidget  *delete_window;
    GError *error = NULL;

    builder = gtk_builder_new();
    if(!(gtk_builder_add_from_file(builder,"delete_window.glade",&error))){
        g_warning("%s",error->message);
        g_free(error);
        return ;
    }

    delete_window = GTK_WIDGET(gtk_builder_get_object(builder,"delete_confirm_window"));
    gtk_builder_connect_signals(builder,NULL);

    g_object_unref(builder);

    gtk_widget_show(delete_window);

}

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

    GtkBuilder *builder;
    MainDate *date;
    GError  *error = NULL;

    gtk_init(&argc,&argv);

    builder = gtk_builder_new();
    if(!(gtk_builder_add_from_file(builder,"main_window.glade",&error))){
        g_warning("%s",error->message);
        g_free(error);
        return 1;
    }

    date = g_slice_new(MainDate);

    date->main_window =      GTK_WIDGET(gtk_builder_get_object(builder,"main_window"));
    date->delete_button = GTK_WIDGET(gtk_builder_get_object(builder,"delete_popmenu"));

    gtk_builder_connect_signals(builder,date);

    g_object_unref(builder);

    gtk_widget_show_all(date->main_window);

    gtk_main();

    g_slice_free(MainDate,date);

    return 0;

}

【讨论】:

  • 谢谢。问题是“G_MODULE_EXPORT”。但是有些编译器不需要这个。但有些人想要这个。你节省了我的时间。
猜你喜欢
  • 2017-12-21
  • 1970-01-01
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多