我正在试图制作一个C程序的测试版本,其中用户可以使用GTK文件选择器加载游戏级别。它似乎工作,并打开文件选择器窗口,但当用户试图选择一个文件时崩溃。这个问题似乎是在的GtkWindow没有被承认为一个GtkWindow,尽管被声明为:GtkWindow未被识别为文件选择器 - C
GtkWidget *window;
window = gtk_window_new(GTK_WINDOW_TOPLEVEL); //initialize window
我然后将其保存到GUI结构的窗口指针:
typedef struct gui gui_t;
struct gui {
GtkWidget *window;
GtkWidget *frame;
GtkWidget *menu_bar;
GtkWidget *drawing_area;
GtkWidget *vbox;
level_t *game;
};
哪个然后传递到下面的load_menu回调,目前只是尝试打印选定的文件名:
void gui_load_menu(gpointer data) {
gui_t *gui = (gui_t *)data;
GtkWindow *window = (GtkWindow *)(gui->window);
GtkWidget *dialog;
dialog = gtk_file_chooser_dialog_new("Load Level", GTK_WINDOW(window), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);
if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
fprintf(stdout, "%s", filename);
}
}
这些是特定的运行时错误:
(guitest:4445):GLib的-的GObject-WARNING **:无效uninstantiatable
guchar' in cast to
类型的GtkWindow”(guitest:4445):GTK的CRITICAL **:gtk_window_set_transient_for:断言`父== NULL | | GTK_IS_WINDOW(父)'失败
任何想法?
谢谢!
用'--g-fatal-warnings'运行整个事情并使用'catchsegv'或'gdb'来获取跟踪/行它崩溃的地方。也放置一些'g_assert(GTK_IS_WINDOW(foo));'测试 – drahnr 2013-02-18 22:17:19
@drahnr我添加了一个断言,检查window是否是一个窗口(我有权访问源),并且断言失败。我看起来更深一点,'data'为空。这是我们使用的回调函数:'g_signal_connect(G_OBJECT(load),“activate”,G_CALLBACK(gui_load_menu),gui);' – 2013-02-18 23:01:27