编写 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 应用程序的方法,使用 GtkApplication
或 gtk_init()
。其中之一是否已过时且不再受欢迎?如果是这样,哪个是首选或应该首选?
关于我在 Gtk 官方教程中找到的两种方法的一些 link:
使用 GtkApplication
现在是新应用程序的首选方式。旧代码手动调用 gtk_init
和 gtk_main
。
gtk_init
仅初始化 GTK+ 并处理一些特定于 GTK+ 的命令行参数。您必须自己完成几乎所有其他事情,甚至添加代码以在用户尝试关闭应用程序时退出 GTK+。
另一方面,GtkApplication
为您调用 gtk_init
,并提供一种方法来管理许多应用程序所需的东西,例如实例唯一性、禁止处理、菜单栏管理等。当然您可以自己编写,但是编写和调试它需要一些时间,而使用 GtkApplication
您可以免费获得这些功能。
人们也常常对如何将他们的代码与事件循环系统(如 GLib 的主循环)进行交互感到困惑。使用 GtkApplication
会强制您立即使用事件循环并了解它是如何完成任务的。这样 您编写的所有代码都是 运行 对事件 的反应。将此与手动调用 gtk_init
进行比较,并在您的主程序中使用一些代码,在事件处理程序中使用其余代码。
我最近开始按照 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 应用程序的方法,使用 GtkApplication
或 gtk_init()
。其中之一是否已过时且不再受欢迎?如果是这样,哪个是首选或应该首选?
关于我在 Gtk 官方教程中找到的两种方法的一些 link:
使用 GtkApplication
现在是新应用程序的首选方式。旧代码手动调用 gtk_init
和 gtk_main
。
gtk_init
仅初始化 GTK+ 并处理一些特定于 GTK+ 的命令行参数。您必须自己完成几乎所有其他事情,甚至添加代码以在用户尝试关闭应用程序时退出 GTK+。
另一方面,GtkApplication
为您调用 gtk_init
,并提供一种方法来管理许多应用程序所需的东西,例如实例唯一性、禁止处理、菜单栏管理等。当然您可以自己编写,但是编写和调试它需要一些时间,而使用 GtkApplication
您可以免费获得这些功能。
人们也常常对如何将他们的代码与事件循环系统(如 GLib 的主循环)进行交互感到困惑。使用 GtkApplication
会强制您立即使用事件循环并了解它是如何完成任务的。这样 您编写的所有代码都是 运行 对事件 的反应。将此与手动调用 gtk_init
进行比较,并在您的主程序中使用一些代码,在事件处理程序中使用其余代码。