编写GTK应用程序的首选方法是什么?

时间:2017-01-27 10:55:37

标签: c gtk gtk3

我最近开始学习如何使用GTK +(3)创建GUI应用程序,方法是遵循gnome网站上的教程(下面的第一个链接)。

所以,我开始学习前几个教程,一切都很顺利。以下是我写的一些早期代码:

#include <gtk/gtk.h>

static void activate (GtkApplication* app, gpointer user_data){
  GtkWidget *window;
  GtkWidget *button_box;
  GtkWidget *button;

  window = gtk_application_window_new (app);
  gtk_window_set_title (GTK_WINDOW (window), "First application");
  gtk_window_set_default_size (GTK_WINDOW (window), 640, 480);

  button_box = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
  gtk_container_add(GTK_CONTAINER(window), button_box);

  button = gtk_button_new_with_label("Click this!");
  g_signal_connect_swapped(button, "clicked", G_CALLBACK(g_print), "Hello, world!\n");
  g_signal_connect_swapped(button, "clicked", G_CALLBACK(gtk_widget_destroy), window);
  gtk_container_add(GTK_CONTAINER(button_box), button);

  gtk_widget_show_all (window);
}

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

  app = gtk_application_new ("com.example.application", 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;
}

一切都像我想要的那样工作。然后,他们介绍了Gtk Builder,我认为它非常整洁,所以我用它来创建一个应用程序。

然而,突然之间,他们开始编写的代码看起来与之前编写的任何内容完全不同(下面的第二个链接)。所以,我很困惑,并决定从其他来源查找一些代码,看看他们如何编写他们的GTK应用程序。我看到他们使用gtk_init()gtk_main()gtk_window_new(GTK_WINDOW_TOPLEVEL)之类的内容。它完全不像我之前发布的代码。

因此,正如我目前所理解的那样,使用GtkApplicationgtk_init()编写GTK应用程序有多种方法。其中一个是过时的,不再是首选的吗?如果是,哪一个是首选或应该是首选?

我在官方Gtk教程中找到的两种方式的一些链接:

1 个答案:

答案 0 :(得分:9)

现在,使用GtkApplication是新应用程序的首选方式。较旧的代码会手动调用gtk_initgtk_main

gtk_init只初始化GTK +并处理一些GTK +特定的命令行参数。你必须自己做其他所有事情,甚至在用户试图关闭应用程序时添加代码来退出GTK +。

另一方面,GtkApplication为您调用gtk_init,并提供了一种管理许多应用程序所需内容的方法,例如实例唯一性,禁止处理,菜单栏管理等。当然,您可以自己写一下,但是你需要一些时间来编写和调试它,而使用GtkApplication你就可以免费获得这些功能。

人们也常常对如何将代码与事件循环系统(如GLib的主循环)进行交互混淆。使用GtkApplication强制您立即使用事件循环并了解它为完成任务所做的工作。这样您编写的所有代码都是针对事件运行的。将此与手动调用gtk_init进行比较,并在主服务器中包含一些代码,其余代码在事件处理程序中。