0

私はC言語を使用してGlade3インターフェースに取り組んでいます。

これまでのところ、ユーザーがファイルを保存する場所を選択する場所が2つあります。参照ボタンをクリックすると開くGtkFileChooserDialogがあります。そのダイアログで[保存]をクリックすると、[参照]ボタンの横にあったGtkEntryがいっぱいになります。

最初にファイルを選択したときは機能しますが、2回目gtk_file_chooser_get_filename()は、ダイアログに何かを入力しても何も返されません。

ソースコードの簡略版を次に示しますが、まだ問題があります:http: //paste.ubuntu.com/1032567/およびそれに対応するGlade3インターフェイスファイル:http: //paste.ubuntu.com/1032572/

このような設定でUIに2つの場所があります。それらの両方で起こります。私には2つの異なるコールバック関数があります。1つはそれを正しく行うための古い試みであり、もう1つは私の最新の試みです。どちらも機能しませんが、新しいものは、返されるものがnullであるかどうかを確認するため、segfaultingを回避します。

新しいコールバックはon_button5_clicked()古いものon_button3_clickedです。

参照を確認しましたが、ファイル名を選択しているのにnullポインターが返される理由については何もわかりませんでした。

どんな助けでも大歓迎です。(私はヘッドバンギングの段階にいるような気がします)。

編集:それで、私は試すべきことについてさらにいくつかのアイデアを持っていました。まず、ダイアログを表示する代わりに、FileChooserウィジェットを使用して独自のウィンドウを作成してみました。これは、gtk_Dialog_Run呼び出しでダイアログが実行されないという問題が発生していないことを確認するために行いました。また、ファイル名文字列へのポインタがnullでないかどうかを確認するコードを繰り返してみました。同じコールバック呼び出しで2回実行されると、null以外の文字列ポインタが返されます。また、ダイアログが起動されるウィンドウ(実際には、gtk_widget_show()ED)自体がダイアログであるという事実とは関係がないことを確認するためにこれを行いました。

ダイアログのボタンをgtk.RESPONSE_OKまたはgtk_RESPONSE_CANCEL応答を持つように設定する必要があるという私の理論を試しました。それは何の効果もなかったようです。

4

3 に答える 3

0

コメントに注意してください(これらは約56から72行目です):

if (widgets != NULL)
{
fprintf(stderr, "widgets is not null\n");
gchar * filename = gtk_file_chooser_get_filename(widgets->zssvpth_FileChooser);

if (filename != NULL)
{
     fprintf(stderr, "filename is not null\n");
 gtk_entry_set_text(widgets->zssvpth_Entry, g_filename_to_utf8(filename,  strlen(filename), NULL, NULL, NULL));

    /* ERROR code below will never be called since filename 
    must be NULL to get here */ 

    if (filename = NULL)
       {
   fprintf(stderr, "Filename is null");
   }
else
   {
   // g_free(filename);
   }
  /* END OF ERROR */

    }
else
{
    fprintf(stderr, "filename is NULL\n");
}
gtk_widget_hide(GTK_WIDGET(widgets->zssvpth_FileChooser));

g_free(filename); // this might be a better place for this call

 }
else
 {
  fprintf(stderr, "widgets is a null pointer!\n");
 }

これは、エラーの追跡に役立つ可能性があります...

于 2012-06-09T19:50:36.403 に答える
0

を呼び出さない限り、ウィジェットを2回目に非表示にして表示すると、呼び出しgtk_file_chooser_get_filename()はnullを返すようですgtk_file_chooser_set_filename()

これに関するドキュメントには何も表示されませんが、ほとんどの場合、ファイル名を取得する対象が変更されている可能性があるため、表示する前にファイル名を設定するのが理にかなっています。したがって、更新するのが理にかなっています。とにかくファイルチューザー。

于 2012-07-18T04:31:04.030 に答える
0

そのはず:

if(filename == NULL)

いいえ:

if(ファイル名= NULL)

それ以外の場合は、NULLに設定します。

于 2013-03-17T03:05:51.957 に答える