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

What is the preferred way to write GTK-applications?

我最近开始按照 gnome 网站上的教程学习如何使用 GTK+(3) 创建 GUI 应用程序(首先 link 在下面)。

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

#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,我觉得它真的很漂亮,所以我就用它来创建一个应用程序。

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

因此,据我目前的理解,有多种编写 GTK 应用程序的方法,使用 GtkApplicationgtk_init()。其中之一是否已过时且不再受欢迎?如果是这样,哪个是首选或应该首选?

关于我在 Gtk 官方教程中找到的两种方法的一些 link:

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

gtk_init 仅初始化 GTK+ 并处理一些特定于 GTK+ 的命令行参数。您必须自己完成几乎所有其他事情,甚至添加代码以在用户尝试关闭应用程序时退出 GTK+。

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

人们也常常对如何将他们的代码与事件循环系统(如 GLib 的主循环)进行交互感到困惑。使用 GtkApplication 会强制您立即使用事件循环并了解它是如何完成任务的。这样 您编写的所有代码都是 运行 对事件 的反应。将此与手动调用 gtk_init 进行比较,并在您的主程序中使用一些代码,在事件处理程序中使用其余代码。