首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >GtkEntry操纵

GtkEntry操纵
EN

Stack Overflow用户
提问于 2014-03-18 19:02:29
回答 1查看 2.1K关注 0票数 0

我正在尝试制作一个小程序,用于在GtkEntry字段之间对数据进行处理。为了做到这一点,我使用全局变量。但是使用g_print函数向我展示我得到的空数据的内容!我的路怎么了?

代码语言:javascript
运行
复制
#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 /Linux并使用这样的脚本进行编译: gcc pkg-config --libs --cflags gtk+-3.0 -o $2 $1

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-18 20:21:14

在程序启动期间检索entry0_text - entry2.text的值。但是由于还没有输入,所以它们包含空字符串。

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

此外,您使用的第二和第三g_print错误;您应该使用

代码语言:javascript
运行
复制
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_prints的' null’。所以使用entry1_text而不是*entry1_text。

下面的代码工作正常;为了简单起见,我使用条目小部件和字符串作为全局变量。

代码语言:javascript
运行
复制
#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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22488665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档