GtkWindow没有被文件选择器识别为 - C

时间:2013-02-18 22:10:54

标签: c gtk

我正在尝试制作一个C程序的测试版本,用户可以使用GTK文件选择器加载游戏级别。它似乎工作,并且打开文件选择器窗口,但在用户尝试选择文件时崩溃。问题似乎是GtkWindow没有被认可为GtkWindow,尽管被宣布为:

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 **:无效的不可实例化类型guchar' in cast to GtkWindow'

     

(guitest:4445):Gtk-CRITICAL **:gtk_window_set_transient_for:断言`parent == NULL || GTK_IS_WINDOW(父)'失败

有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

您需要为回调使用正确的签名,该签名应为

void gui_load_menu(GtkWidget *widget, gpointer data)

每个回调都可以有不同的签名,您需要查看文档中的信号,以查看它是什么。我假设在这种情况下load是一个GtkMenuItem,文档在这里:http://developer.gnome.org/gtk3/3.2/GtkMenuItem.html#GtkMenuItem-activate