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

Zyp*_*icx 5 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

所以,我目前的理解,也有写GTK的应用程序,或者使用多种方式GtkApplicationgtk_init().其中一个是过时的,不再是首选的吗?如果是,哪一个是首选或应该是首选?

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

lib*_*rce 9

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

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

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

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

  • 很公平,但我如何将GtkApplication与GtkBuilder结合使用? (2认同)
  • 这在同一页面上描述:您创建一个GtkBuilder ui文件,您创建一个GResource文件(可选,但更清洁,并简化您的应用程序的分发),您编译资源,并调用gtk_widget_class_set_from_template并将其传递给您的ui资源的位置.这在["填充窗口"](https://developer.gnome.org/gtk3/stable/ch01s04.html#id-1.2.3.12.)部分中进行了解释. (2认同)