【问题标题】:GtkEntry manipulationGtkEntry 操作
【发布时间】:2017-04-27 03:02:06
【问题描述】:

我正在尝试制作一个小程序来操作 GtkEntry 字段之间的数据。为此,我使用全局变量。但是使用 g_print 函数向我显示我得到 NULL 数据的内容!我的方式有什么问题?

#include <gtk/gtk.h>

const gchar *entry0_text;
const gchar *entry1_text;
const gchar *entry2_text;

static void my_function (GtkWidget *widget, GtkWidget *entry)
{
  g_print ("Entry0 contents: %s\n", gtk_entry_get_text (GTK_ENTRY (entry)));

  g_print ("Entry1 contents: %s\n", *entry0_text);
  g_print ("Entry2 contents: %s\n", *entry1_text);

}

static void
activate (GtkApplication *app,
          gpointer        user_data)
{
  GtkWidget *window;
  GtkWidget *grid;
  GtkWidget *button;
  GtkWidget *entry0;
  GtkWidget *entry1;
  GtkWidget *entry2;

  window = gtk_application_window_new (app);
  gtk_window_set_title (GTK_WINDOW (window), ":-)");
  gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
  gtk_container_set_border_width (GTK_CONTAINER (window), 20);

  grid = gtk_grid_new ();
  gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (grid));

  entry0 = gtk_entry_new ();
  gtk_grid_attach (GTK_GRID (grid), entry0, 0, 0, 1, 1);
  entry0_text = gtk_entry_get_text (GTK_ENTRY (entry0));

  entry1 = gtk_entry_new ();
  gtk_grid_attach (GTK_GRID (grid), entry1, 1, 0, 1, 1);
  entry1_text = gtk_entry_get_text (GTK_ENTRY (entry1));

  entry2 = gtk_entry_new ();
  gtk_grid_attach (GTK_GRID (grid), entry2, 0, 1, 1, 1);
  entry2_text = gtk_entry_get_text (GTK_ENTRY (entry2));

  button = gtk_button_new ();
  gtk_grid_attach (GTK_GRID (grid), button, 1, 1, 1, 1);
  g_signal_connect (button, "clicked", G_CALLBACK (my_function), entry0);

  gtk_widget_show_all (window);
}

int
main (int argc, char **argv)
{
  GtkApplication *app;
  int status;

  app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);
  g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
  status = g_application_run (G_APPLICATION (app), argc, argv);
  g_object_unref (app);

  return status;
}

我正在使用 Debian GNU/Linux 并使用如下脚本进行编译: gcc pkg-config --libs --cflags gtk+-3.0 -o $2 $1

谢谢!

【问题讨论】:

    标签: c gtk gtkentry


    【解决方案1】:

    entry0_text - entry2.text 的值是在程序启动期间检索的。但由于尚未创建条目,因此它们包含空字符串。

    您必须在回调函数 my_function 内,而不是在 activate 函数内,对所有条目小部件使用 gtk_entry_get_text

    除此之外,您还错误地使用了第二个和第三个 g_print;你应该使用

    g_print ("Entry1 contents: %s\n", entry1_text);
    g_print ("Entry2 contents: %s\n", entry2_text);
    

    请记住,在您的程序启动后,entry1_text 和entry2_text 包含空字符串。但是使用 *entry1_text 和 *entry2_text 您将不会收到空字符串,而是该字符串的第一个元素,即终止的 '\0' 空字符,这就是您收到这些 g_print 的 'null' 的原因。所以使用 entry1_text 而不是 *entry1_text。

    以下代码运行正常;为简单起见,我将条目小部件和字符串用作全局变量。

    #include <gtk/gtk.h>
    #include <string.h>
    
    GtkWidget *entry0;
    GtkWidget *entry1;
    GtkWidget *entry2;
    
    const gchar *entry0_text;
    const gchar *entry1_text;
    const gchar *entry2_text;
    
    static void my_function (void)
    {
      entry0_text = gtk_entry_get_text (GTK_ENTRY (entry0));
      entry1_text = gtk_entry_get_text (GTK_ENTRY (entry1));
      entry2_text = gtk_entry_get_text (GTK_ENTRY (entry2));
    
      g_print ("Entry0 contents: %s\n", entry0_text);
      g_print ("Entry1 contents: %s\n", entry1_text);
      g_print ("Entry2 contents: %s\n", entry2_text);
    
    }
    
    static void
    activate (GtkApplication *app,
              gpointer        user_data)
    {
      GtkWidget *window;
      GtkWidget *grid;
      GtkWidget *button;
    
      window = gtk_application_window_new (app);
      gtk_window_set_title (GTK_WINDOW (window), ":-)");
      gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
      gtk_container_set_border_width (GTK_CONTAINER (window), 20);
    
      grid = gtk_grid_new ();
      gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (grid));
    
      entry0 = gtk_entry_new ();
      gtk_grid_attach (GTK_GRID (grid), entry0, 0, 0, 1, 1);
    
      entry1 = gtk_entry_new ();
      gtk_grid_attach (GTK_GRID (grid), entry1, 1, 0, 1, 1);
    
      entry2 = gtk_entry_new ();
      gtk_grid_attach (GTK_GRID (grid), entry2, 0, 1, 1, 1);
    
      button = gtk_button_new ();
      gtk_grid_attach (GTK_GRID (grid), button, 1, 1, 1, 1);
      g_signal_connect (button, "clicked", G_CALLBACK (my_function), NULL);
    
      gtk_widget_show_all (window);
    }
    
    int
    main (int argc, char **argv)
    {
      GtkApplication *app;
      int status;
    
      app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);
      g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
      status = g_application_run (G_APPLICATION (app), argc, argv);
      g_object_unref (app);
    
      return status;
    }
    

    【讨论】:

    • 此代码运行良好,谢谢。现在我将进一步研究它并尝试操纵数据。再见。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2012-09-28
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多