在 GTK+ 应用程序中使用基于"模板"的方法有什么优势吗?我正在制作我的第一个 GTK+ 应用程序,我在互联网上发现创建 GTK+ 应用程序有很多变体,一些较旧的外观方法,一些较新的方法,我查看了 GTK+ 开发指南,它使用了一个带有子类等的复杂外观"模板"。请参阅: https://developer.gnome.org/gtk3/stable/ch01s04.html
我的问题是我可以用我的方法做,还是应该使用模板/子类?
我的方式:
<interface>
<requires lib="gtk+" version="3.20"/>
<object class="GtkApplicationWindow" id="window">
...
#include <gtk/gtk.h>
static void activate (GtkApplication* app, gpointer user_data) {
GtkBuilder *builder = gtk_builder_new_from_file ("gui.glade");
GtkWidget *window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
gtk_builder_connect_signals (builder, NULL);
gtk_widget_show_all (window);
gtk_main ();
}
int main (int argc, char *argv[]) {
GtkApplication *app = gtk_application_new ("a.b.c", G_APPLICATION_FLAGS_NONE);
g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
int status = g_application_run (G_APPLICATION (app), argc, argv);
g_object_unref (app);
return status;
}
与"模板"方式:
<interface>
<requires lib="gtk+" version="3.20"/>
<template class="ExampleAppWindow" parent="GtkApplicationWindow">
...
#include <gtk/gtk.h>
#include "exampleapp.h"
#include "exampleappwin.h"
struct _ExampleApp
{
GtkApplication parent;
};
G_DEFINE_TYPE(ExampleApp, example_app, GTK_TYPE_APPLICATION);
static void
example_app_init (ExampleApp *app)
{
}
static void
example_app_activate (GApplication *app)
{
ExampleAppWindow *win;
win = example_app_window_new (EXAMPLE_APP (app));
gtk_window_present (GTK_WINDOW (win));
}
static void
example_app_open (GApplication *app,
GFile **files,
gint n_files,
const gchar *hint)
{
GList *windows;
ExampleAppWindow *win;
int i;
...
根据我的理解,区别在于模板+子类可以很容易地重用。按照自己的方式™进行操作,您将不得不使用多个 GtkBuilder 对象,并且在 XML 中定义信号时仍然存在问题。
因此,例如,如果您有一个从代码中的 N 个不同位置使用的对话框,则应使用模板。
此外,例如,如果您希望拥有主窗口的 N 个副本,其中 N 由用户交互定义,那么按照自己的方式™进行操作几乎是不可能的。