代码之家  ›  专栏  ›  技术社区  ›  Hanlon

如何在此GTK应用程序中创建窗口?

  •  0
  • Hanlon  · 技术社区  · 6 年前

    tutorial . 我现在在 Building applications 部分。有一件事让我很困惑,那就是应用程序窗口最初是如何创建的。让我解释一下。

    程序是这样开始的:

    #include <gtk/gtk.h>
    #include "exampleapp.h"
    
    int
    main (int argc, char *argv[])
    {
      return g_application_run (G_APPLICATION (example_app_new ()), argc, argv);
    }
    

    g_application_run 功能。该函数接受三个参数:app、参数count和参数vector。让我们看看这个应用程序是如何创建的。

    #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;
    
      windows = gtk_application_get_windows (GTK_APPLICATION (app));
      if (windows)
        win = EXAMPLE_APP_WINDOW (windows->data);
      else
        win = example_app_window_new (EXAMPLE_APP (app));
    
      for (i = 0; i < n_files; i++)
        example_app_window_open (win, files[i]);
    
      gtk_window_present (GTK_WINDOW (win));
    }
    
    static void
    example_app_class_init (ExampleAppClass *class)
    {
      G_APPLICATION_CLASS (class)->activate = example_app_activate;
      G_APPLICATION_CLASS (class)->open = example_app_open;
    }
    
    ExampleApp *
    example_app_new (void)
    {
      return g_object_new (EXAMPLE_APP_TYPE,
                           "application-id", "org.gtk.exampleapp",
                           "flags", G_APPLICATION_HANDLES_OPEN,
                           NULL);
    }
    

    G_DEFINE_TYPE(ExampleApp, example_app, GTK_TYPE_APPLICATION); ExampleApp GtkApplication (但以一种巧妙的方式,使类型、变量等与 GTK应用 现在与 示例应用程序

    现在让我们看看 ExampleApp *example_app_new(void) GtkApplication * ,因为我们 示例应用程序 具有 GTK应用 . 接下来,该函数通过调用 g_object_new

    • EXAMPLE_APP_TYPE ,这只是 GTK_TYPE_APPLICATION
    • "application-id"
    • "org.gtk.exampleapp" ,ID
    • "flags" ,表示下一个参数是一个标志
    • "G_APPLICATION_HANDLES_OPEN" ,一个旗子
    • NULL

    对象\u新建 ,这样叫,回来了 GTK应用 "org.gtk.exampleapp示例" 还有一面旗子 “G\应用程序\处理\打开” . 在程序返回到 example_app_new ExampleApp * 又名。 GTK应用* main . 新应用程序将被强制转换为 GApplication 在里面 应用程序运行 G_APPLICATION 宏。


    你现在明白我的意思了。现在你会明白我不明白的。

    这个问题顶部链接的教程说,这会创建一个空窗口。在本教程的早期部分(如 this one )我们曾经 g_signal_connect

    g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
    

    调用函数 activate 当应用程序 app 正在使用运行 应用程序运行 激活 通常会创建一个窗口,并通过自身或调用其他函数来填充它。这就是让我困惑的地方:在我们的生活中没有这样的事情 示例应用程序

    1 回复  |  直到 6 年前
        1
  •  0
  •   Hanlon    6 年前

    捕获在覆盖中 activate open 功能。上面写着 here :

    为了处理这两种情况,我们重写activate()vfunc,当应用程序在没有命令行参数的情况下启动时调用它;重写open()vfunc,当应用程序在没有命令行参数的情况下启动时调用它。

    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;
    
      windows = gtk_application_get_windows (GTK_APPLICATION (app));
      if (windows)
        win = EXAMPLE_APP_WINDOW (windows->data);
      else
        win = example_app_window_new (EXAMPLE_APP (app));
    
      for (i = 0; i < n_files; i++)
        example_app_window_open (win, files[i]);
    
      gtk_window_present (GTK_WINDOW (win));
    }
    

    在给定参数时调用。