2

私はこの空き地 (およびこのフォーラム) に慣れていないので、どなたか助けていただけるかどうかを知りたいです:

ユーザーが選択ボタンから選択したファイル名を取得し、それを文字列として関数に送信する必要があります。残念ながら、私はこの迷惑なエラーを受け取りました:

Gtk-CRITICAL **: IA__gtk_file_chooser_get_uri: アサーション `GTK_IS_FILE_CHOOSER (chooser)' が失敗しました

ウィジェットの使い方が間違っていたのだと思いました。誰かがこれを理解するのを手伝ってくれますか? ソース コードを以下に示します。ご覧のとおり、https: //live.gnome.org/Glade/Tutorials にある Glade-GTK チュートリアルからのものです。

プログラムは単純な 2 ボタン ウィンドウです。最初のボタンはファイル選択ボタンで、2 番目のボタンはクリックすると "clica" 関数を呼び出す標準ボタンです。ユーザーがファイル選択ボタンで選択したファイル名を表示する必要がありますが、そのときにエラーが発生します。

テスト ソース (ウィジェットの使用方法を把握するため):

#include <gtk/gtk.h>

int
main( int    argc,
      char **argv )
{
    GtkBuilder *builder;
    GtkWidget  *window;
    GError     *error = NULL;

    /* Init GTK+ */
    gtk_init( &argc, &argv );

    /* Create new GtkBuilder object */
    builder = gtk_builder_new();
    /* Load UI from file. If error occurs, report it and quit application.
     * Replace "tut.glade" with your saved project. */
    if( ! gtk_builder_add_from_file( builder, "tut.glade", &error ) )
    {
        g_warning( "%s", error->message );
        g_free( error );
        return( 1 );
    }

    /* Get main window pointer from UI */
    window = GTK_WIDGET( gtk_builder_get_object( builder, "window1" ) );

    /* Connect signals */
    gtk_builder_connect_signals( builder, NULL );

    /* Destroy builder, since we don't need it anymore */
    g_object_unref( G_OBJECT( builder ) );

    /* Show window. All other widgets are automatically shown by GtkBuilder */
    gtk_widget_show( window );

    /* Start main loop */
    gtk_main();

    return( 0 );
}

void clica(GtkFileChooser *filechooserbutton1){//this button was inserted through Glade
   char cNome[250];
      *cNome = gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(filechooserbutton1));

      printf("\n%s", cNome);

}

グレードファイル:

<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <requires lib="gtk+" version="2.24"/>
  <!-- interface-naming-policy project-wide -->
  <object class="GtkWindow" id="window1">
    <property name="can_focus">False</property>
    <child>
      <object class="GtkHBox" id="hbox1">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <child>
          <object class="GtkFileChooserButton" id="filechooserbutton1">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
          </object>
          <packing>
            <property name="expand">True</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="GtkButton" id="button1">
            <property name="label" translatable="yes">button</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
            <property name="use_action_appearance">False</property>
            <signal name="clicked" handler="clica" swapped="no"/>
          </object>
          <packing>
            <property name="expand">True</property>
            <property name="fill">True</property>
            <property name="position">1</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>
4

1 に答える 1

1

2013 年 4 月 1 日更新 (これでグレード ファイルができました)

間違ったオブジェクトの信号を使用したことがわかります。「clica」コールバックを GtkFileChooserButton「filechooserbutton1」に接続する代わりに、GtkButton「button1」の「クリック」シグナルに接続しました。

元の回答: 空き地ファイルがないと、接続されている信号ではなく、どの信号が接続されているかを確認できません。しかし、信号のプロトタイプに従っていない可能性があります。アサーションが失敗した場合、それはコールバックで、GtkFileChooser であると考える最初の引数が別のものであることを意味します。

于 2013-01-03T17:41:19.913 に答える