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

时间:2018-09-02 10:47:15

标签: c gtk gtk3

我正在关注此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函数启动该应用程序。该函数接受三个参数:应用程序,参数计数和参数向量。让我们看看如何创建此应用。

#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);行是ExampleAppGtkApplication的别名(但是以一种聪明的方式,与GtkApplication关联的类型,变量等现在与{{ 1}})。

现在让我们看一下ExampleApp函数。该函数实际上返回ExampleApp *example_app_new(void),因为我们将GtkApplication *ExampleApp关联了。接下来,此函数通过调用GtkApplication函数来调用并返回一个新对象。该函数采用以下参数:

  • g_object_new,仅是EXAMPLE_APP_TYPE
  • GTK_TYPE_APPLICATION,它告诉下一个参数是应用程序的ID
  • "application-id",ID
  • "org.gtk.exampleapp",它告诉下一个参数是一个标记
  • "flags",一个标志
  • "G_APPLICATION_HANDLES_OPEN",终止符

NULL这样返回,返回ID为g_object_new且标志为GtkApplication的{​​{1}}。程序返回到"org.gtk.exampleapp"之后,它退出并返回一个"G_APPLICATION_HANDLES_OPEN"类型的新对象。 example_app_newExampleApp *。使用GtkApplication *宏将新应用投射到main中的GApplication


您现在已经了解了我的理解。现在,您将看到我不明白的内容。

此问题顶部的教程链接说,这将创建一个空窗口。在本教程的较早部分(如this one)中,我们在运行应用程序时使用g_application_run来调用函数。例如,

G_APPLICATION

在使用g_signal_connect运行应用程序g_signal_connect (app, "activate", G_CALLBACK (activate), NULL); 时调用函数activate。函数app通常会依次创建一个窗口并通过自身或调用其他函数来填充它。那就是让我感到困惑的:在我们的示例应用程序中没有这样的东西。那么如何创建窗口?

1 个答案:

答案 0 :(得分:0)

问题在于重写activateopen函数。它说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));
}
当给定参数时会调用