【问题标题】:Glade-GTK+ C language: How to use FileChooserButton to get a filename?Glade-GTK+ C 语言:如何使用 FileChooserButton 获取文件名?
【发布时间】:2013-01-03 15:43:30
【问题描述】:

我是这个林间空地的新手(也是这个论坛的新手),想知道你们中是否有人可以帮助我:

我必须获取用户从选择器按钮中选择的文件名,并将其作为字符串发送给函数。不幸的是,我收到了这个烦人的错误:

Gtk-CRITICAL **: IA__gtk_file_chooser_get_uri: 断言 `GTK_IS_FILE_CHOOSER (chooser)' 失败

我认为这是由于错误使用了小部件。有人可以帮我解决这个问题吗?源代码如下,如您所见,它来自https://live.gnome.org/Glade/Tutorials 上的 Glade-GTK 教程。

该程序是一个简单的 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>

【问题讨论】:

    标签: c user-interface gtk glade


    【解决方案1】:

    04/01/2013 更新(现在我们有了 glade 文件)

    我们现在可以看到您使用了错误对象的信号。您将“clica”回调连接到 GtkButton“button1”的“clicked”信号,而不是将其连接到 GtkFileChooserButton“filechooserbutton1”。

    原答案: 如果没有 glade 文件,我们无法看到您连接了哪些信号,而不是它们连接的信号。但是,您可能没有遵循信号的原型。如果断言失败,这意味着在你的回调中,你认为是 GtkFileChooser 的第一个参数是别的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      • 2011-06-24
      相关资源
      最近更新 更多