2

ユーザーが GTK ファイル セレクターを使用してゲーム レベルをロードできる C プログラムのテスト バージョンを作成しようとしています。動作しているようで、ファイル選択ウィンドウを開きますが、ユーザーがファイルを選択しようとするとクラッシュします。次のように宣言されているにもかかわらず、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 toGtkWindow'

(guitest:4445): Gtk-CRITICAL **: gtk_window_set_transient_for: assertion `parent == NULL || GTK_IS_WINDOW (親)' が失敗しました

何か案は?

ありがとう!

4

1 に答える 1

1

コールバックには正しい署名を使用する必要があります。

void gui_load_menu(GtkWidget *widget, gpointer data)

各コールバックは異なるシグネチャを持つことができ、それが何であるかを確認するには、使用するシグナルのドキュメントを参照する必要があります。この場合loadは GtkMenuItem であると推測しています。ドキュメントは次のとおりです: http://developer.gnome.org/gtk3/3.2/GtkMenuItem.html#GtkMenuItem-activate

于 2013-02-19T01:22:38.937 に答える