我最近开始学习如何使用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)
之类的内容。它完全不像我之前发布的代码。
因此,正如我目前所理解的那样,使用GtkApplication
或gtk_init()
编写GTK应用程序有多种方法。其中一个是过时的,不再是首选的吗?如果是,哪一个是首选或应该是首选?
我在官方Gtk教程中找到的两种方式的一些链接:
答案 0 :(得分:9)
现在,使用GtkApplication
是新应用程序的首选方式。较旧的代码会手动调用gtk_init
和gtk_main
。
gtk_init
只初始化GTK +并处理一些GTK +特定的命令行参数。你必须自己做其他所有事情,甚至在用户试图关闭应用程序时添加代码来退出GTK +。
另一方面,GtkApplication
为您调用gtk_init
,并提供了一种管理许多应用程序所需内容的方法,例如实例唯一性,禁止处理,菜单栏管理等。当然,您可以自己写一下,但是你需要一些时间来编写和调试它,而使用GtkApplication
你就可以免费获得这些功能。
人们也常常对如何将代码与事件循环系统(如GLib的主循环)进行交互混淆。使用GtkApplication
强制您立即使用事件循环并了解它为完成任务所做的工作。这样您编写的所有代码都是针对事件运行的。将此与手动调用gtk_init
进行比较,并在主服务器中包含一些代码,其余代码在事件处理程序中。