跳转到内容

GTK+ 示例/入门

来自维基教科书,开放世界中的开放书籍

在本章中,我们将研究一些非常简单的 GTK+ 示例,从经典的“Hello, world!” 开始。

  1. 您会发现,通过动手编写代码,您可以更有效地学习。
  2. 在继续学习下一章之前,请确保您理解自己正在做什么。本书中的章节被设计为独立的单元,但假设您已经了解了前几章的背景知识。
  3. 您可以复制粘贴代码来获得快速结果,但手动输入将帮助您熟悉 GTK+ 的编码风格,因此建议您这样做。
  4. 慢慢来,告诉自己,每个示例都能运行,真是太棒了。
  5. 修改代码,犯错误,让事情出错,享受乐趣!

编译示例

[编辑 | 编辑源代码]

编译这些示例程序时,您可能需要向命令行传递其他信息以启用 GTK+ 窗口库。

在 Linux 上,您需要确保安装了 pkg-config 程序。

gcc -Wall -g helloworld.c -o helloworld `pkg-config --cflags gtk+-2.0` `pkg-config --libs gtk+-2.0`

更多信息请访问:https://developer.gnome.org/gtk-tutorial/stable/x111.html

空窗口

[编辑 | 编辑源代码]

在这个示例中,我们创建了一个窗口,设置了它的标题和大小,并连接了一个事件,允许应用程序关闭。

#include <gtk/gtk.h>

int
main (int   argc,
      char *argv[])
{
  GtkWidget *window;

  /* Initialise GTK+ passing to it all command line arguments  */
  gtk_init (&argc, &argv);

  /* create a new window, set values */
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title (GTK_WINDOW (window), "Hello GTK+ World");
  /* set the size of the window */
  gtk_widget_set_size_request (GTK_WIDGET (window), 200, 200);
  /* connect the windows "destroy" event */
  g_signal_connect (G_OBJECT (window), "destroy",
                    G_CALLBACK (gtk_main_quit), NULL);  

  /* set the window as visible */
  gtk_widget_show (window);

  /* run the GTK+ main loop */
  gtk_main ();
  return 0;
}


恭喜您,您创建了第一个 GTK+ 窗口。您可能还没有完全理解自己编写的代码。没关系,在本节结束之前,创建窗口将变得很容易。GTK+ 是面向对象的。由于 C 语言并非为面向对象语言而设计,因此您必须显式地强制转换对象,这在传递给函数的参数中最为常见。当您编写 GTK_WINDOW(window) 时,您首先将 window 从 GtkWidget 强制转换为 GtkWindow。如果您不理解这个示例,请在完成两个小挑战后随意继续。您可能很容易猜到如何完成它们,但不要被骗。即使是完成小任务也能帮助您专注于解决大问题。

挑战:将窗口名称更改为您的名字。
挑战:将窗口大小更改为 400 * 400 像素,目前是 200 * 200 像素。


在本节结束时,我们将解释这个示例中的所有内容,但现在让我们关注两行代码。

gtk_init (&argc, &argv);
gtk_init() 在所有 GTK+ 应用程序的开头调用,它初始化 gtk+ 库。&argc 和 &argv 被传递给 gtk_init(),它们是传递给应用程序的命令行参数。gtk_init() 获取这些参数,因为它有一组它可以接受的命令行参数。
gtk_main ();
gtk_main() 在应用程序设置完成后调用,一旦调用,您就必须等到 gtk_main_quit() 被调用才能继续执行应用程序。我们已经连接了该事件,并在后面的练习中进行解释。

带按钮的窗口

[编辑 | 编辑源代码]

这个示例与上一个示例略有不同,我们添加了一个按钮,并且注意到我们没有调用 gtk_widget_set_size_request()。

#include <gtk/gtk.h>

int
main (int   argc,
      char *argv[])
{
  GtkWidget *window;
  GtkWidget *button;

  /* Initialise GTK+ passing to it all command line arguments  */
  gtk_init (&argc, &argv);

  /* create a new window, set values */
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title (GTK_WINDOW (window), "Hello Button");
  /* connect the windows "destroy" event */
  g_signal_connect (G_OBJECT (window), "destroy",
                    G_CALLBACK (gtk_main_quit), NULL);  

  button = gtk_button_new_with_label ("Hello Window");
  gtk_container_add (GTK_CONTAINER (window), button);
  g_signal_connect (G_OBJECT (button), "clicked",
                    G_CALLBACK (gtk_main_quit), NULL);

  /* set the window as visible */
  gtk_widget_show_all (window);

  /* run the GTK+ main loop */
  gtk_main ();
  return 0;
}


干得好,又完成了一个。还没完,和我一样,继续。当您单击按钮时,它会关闭窗口,这是一个多么恼人的应用程序?它正在试图让你注意到它是如何做到的。注意这次我们没有调用 gtk_widget_set_size_request(),这是因为 GTK+ 会自动为您调整窗口和小部件的大小,在大多数情况下,您不应该自己设置小部件或窗口的大小;上一个示例之所以不同,是因为窗口中没有任何内容。顾名思义,size_request 表示您要求的大小可能不是分配给小部件的大小,这将在本书后面的内容中进一步解释,现在只要理解它是请求就足够了。

挑战:使按钮在您单击时没有任何反应,没错,什么也不做。
挑战:删除以“button =”开头的行,然后从命令行运行您的程序,看看会发生什么。


我们现在还没有解释所有内容,那样会让您失去乐趣。无论如何,您完成挑战了吗?我敢肯定您做得很好。让我们再看两行代码

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_new() 创建一个新的窗口,它有两种类型:GTK_WINDOW_TOPLEVEL 和 GTK_WINDOW_POPUP。不要让 GTK_WINDOW_POPUP 这个名字迷惑您,它并非用于弹出对话框,弹出对话框和 GTK_WINDOW_POPUP 都将在后面的章节中解释。
button = gtk_button_new_with_label ("Hello Window");
button_new_with_label() 是一个便捷函数,在这种情况下,它意味着它会为您创建一个按钮和一个标签,并将标签插入按钮中。GTK+ 中的按钮是一个容器,当单击时可能会导致一段代码运行。按钮可以包含您插入其中的任何内容,但仅仅为了好玩而将某些东西放在按钮中会真正让人困惑,因此我们建议您插入标签或图像,如果您是一个很棒的人,您将学会以您现在的速度插入图像和标签,您很快就会统治世界。
华夏公益教科书