我正在尝试制作一个 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(父)'失败
有任何想法吗?
谢谢!