GtkApplication 和 gtk_init 有什么区别?

What's the difference between GtkApplication and gtk_init?

我现在正在学习在 Linux 中使用 GTK+3.0 和 C。阅读一些教程和示例代码后,我对如何初始化应用程序有一些疑问。

这是我看到的两个版本的代码。

#include <gtk/gtk.h>

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

  window = gtk_application_window_new (app);
  gtk_window_set_title (GTK_WINDOW (window), "Window");
  gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
  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;
}

此代码使用 gtk_application_new() 初始化 GtkApplication 并使用 g_application_run() 启动它。

这是第二个

#include <gtk/gtk.h>

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

  window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(window),"helloworld");
  gtk_widget_show(window);
  gtk_main();

  return 0;
}

此代码使用 gtk_init() 初始化应用程序并 gtk_main() 到 运行 它。

但是,我无法弄清楚它们之间的区别,因为 运行ning 结果似乎是一样的。

gtk_init()函数初始化库使用的内部变量,g_application_new()在内部调用gtk_init(),所以没有区别或相似,它们有不同的用途,只是其中一个,包括另一个。

我不是通过阅读文档或类似的东西知道这一点的,这只是一个合乎逻辑的结论。

创建 GtkApplication 可能是为了避免在 Gtk+ 库中使用全局变量,而现在您可以使用 GtkApplication 来保存应用程序范围的变量。

看来是正确的做法,我个人很喜欢,但是好久没写Gtk+的应用了,而且是2版的,所以不是很了解.

Gtk+ 有一个很棒的特性,就是它有很好的文档记录,只需 google for GtkApplication 你就会更好地理解它的用途以及应该如何使用它。

看看GtkApplication documentation

Class GtkApplication 处理初始化、应用程序的生命周期、主要 windows、全局资源等。如果你不想使用它,一切都很好,但如果你需要它们,你将不得不手动完成所有这些事情。

这包括 Gtk 的初始化:调用 gtk_init()

  1. GtkApplication 引入动作支持,您可以使用动作来解耦可操作项(如菜单、按钮等)和相应的回调。
  2. 您可以使用 g_application_send_notification 来显示通知,并替换已弃用的 GtkStatusIcon
  3. 您可以使用命令行在现有应用程序中打开文件:https://developer.gnome.org/gio/stable/GApplication.html#GApplication-open