C语言 GTK+ 中基于模板的 UI 有哪些优势



在 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 由用户交互定义,那么按照自己的方式™进行操作几乎是不可能的。

相关内容

  • 没有找到相关文章

最新更新