2016-05-16 31 views
0

gtk_file_chooser_dialogを複数回再利用したいと思います。しかし、ユーザーが最初にダイアログを閉じると、GtkFileChooserDialog構造体へのポインタが壊れているように見えます。gtk_file_chooser_dialogを複数回再利用

最初に診断ログを開くと成功します。 同じダイアログを開く

(crystal_facet_uml:3797): GLib-GObject-WARNING **: invalid unclassed pointer in cast to 'GtkWidget' 
(crystal_facet_uml:3797): Gtk-CRITICAL **: gtk_widget_show_all: assertion 'GTK_IS_WIDGET (widget)' failed 

で二回目の結果は、私の最初のアイデアは、最大cleaedされるのを防ぐために、ダイアログ上の参照カウンタを増加させることであった:

(*this_).use_db_file_chooser = gtk_file_chooser_dialog_new ("Select DB to use", 
                  GTK_WINDOW((*this_).window), 
                  GTK_FILE_CHOOSER_ACTION_SAVE, 
                  "Cancel", 
                  GTK_RESPONSE_CANCEL, 
                  "Create/Use DB-File", 
                  GTK_RESPONSE_ACCEPT, 
                  NULL 
                  ); 
g_object_ref((*this_).use_db_file_chooser); 

...しかし、これが唯一の問題をシフト:ダイアログウィンドウが滞在するようだが、含まれているウィジェットがなくなっている:

(crystal_facet_uml:3797): Gtk-CRITICAL **: gtk_container_foreach: assertion 'GTK_IS_CONTAINER (container)' failed 
(crystal_facet_uml:3797): Gtk-CRITICAL **: gtk_container_foreach: assertion 'GTK_IS_CONTAINER (container)' failed 
(crystal_facet_uml:3797): Gtk-CRITICAL **: gtk_container_foreach: assertion 'GTK_IS_CONTAINER (container)' failed 
(crystal_facet_uml:3797): Gtk-CRITICAL **: gtk_container_foreach: assertion 'GTK_IS_CONTAINER (container)' failed 
(crystal_facet_uml:3797): Gtk-CRITICAL **: _gtk_file_chooser_embed_initial_focus: assertion 'GTK_IS_FILE_CHOOSER_EMBED (chooser_embed)' failed 
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged. 
(crystal_facet_uml:3797): Gtk-CRITICAL **: gtk_container_foreach: assertion 'GTK_IS_CONTAINER (container)' failed 

あなたはこの権利を行うにはどのようなアイデアを持っていますか?

(ファイル選択ダイアログを再利用する理由は次のとおりです。)1)最初にそれを割り当て、NULLポインタを気にしないで2)現在のフォルダ、現在のファイル名)、3)私はこの非モーダルダイアログを一度だけ、一度に2つのダイアログを決して開始したくない、4)私のプログラムの寿命を通してg_signalバインディングを保持したい。

(完全なソースコード:https://sourceforge.net/p/crystal-facet-uml/code/ci/46ee183ea06baae3af70d81c74efe767fccc5028/tree/gui/source/gui_main_window.c

答えて

0

私は(C GTK can't open Dialog again after closing via ESCへの答えとhttps://developer.gnome.org/gtk3/stable/GtkWidget.html#GtkWidget-delete-eventに関する資料の助けを借りて)素敵な解決策を見つけた:

単純に、ダイアログの削除イベントを接続GTK-事前に定義されたコールバック関数gtk_widget_hide_on_delete():

g_signal_connect(G_OBJECT((*this_).use_db_file_chooser), "delete-event", G_CALLBACK(gtk_widget_hide_on_delete), NULL); 

そしてユーザーが閉じるときに、ダイアログオブジェクトが破壊されていません。

関連する問題