连接函数到GtkAction

3
我正在尝试使用C编写一个GTK+3应用程序。
我创建了一个包含动作的Glade文件,其ID为“tracks_deck.add_empty_track”。
我将该动作连接到工具栏项和菜单项。
问题是如何将函数连接到该动作?
我有以下C代码:
#include <gtk/gtk.h>
#define UI_FILE "tuxmusicstudio.glade" 
#define TOP_WINDOW "application_window"

int main (int argc, char *argv[])
{
GtkWidget *main_window;
GtkBuilder *builder;
GError *error = NULL;

GtkAction *action;

gtk_init (&argc, &argv);

builder = gtk_builder_new();
if (!gtk_builder_add_from_file(builder, UI_FILE, &error)) {
    g_critical("couldn't load builder file: %s",error->message);
    g_error_free(error);
}

/* create the main, top level, window */
main_window = GTK_WIDGET(gtk_builder_get_object(builder, TOP_WINDOW));
if (!main_window) {
    g_critical("widget \"%s\" is missing in file %s.",TOP_WINDOW,UI_FILE);
} 

action = GTK_ACTION(gtk_builder_get_object(builder, "tracks_deck.add_empty_track"));
if (!action) {
    g_critical("could not fetch action tracks_deck.empty_track");
}

 gtk_widget_show_all (main_window);

/* start the main loop, and let it rest there until the application is closed */
gtk_main ();

return 0;

所以你可以看到,我正在尝试获取GtkAction以便连接一个函数。 编译器正在编译这一行已经过时了:

main.c:46:5: warning: ‘gtk_action_get_type’ is deprecated (declared at /usr/include/gtk-3.0/gtk/deprecated/gtkaction.h:87) [-Wdeprecated-declarations]
 action = GTK_ACTION(gtk_builder_get_object(builder, "tracks_deck.add_empty_track"));
 ^

那么,我如何使用一些未被弃用的函数来获取GtkAction?并且如何将C函数连接到该操作?!

对于这个问题,任何想法都将不胜感激。

2个回答

2

来自GtkAction

描述

在GTK+ 3.10中,GtkAction已被弃用。改用GAction,并将操作与GtkActionable小部件相关联。使用GMenuModel创建具有gtk_menu_new_from_model()的菜单。

因此,看起来应该转向使用GAction

我看到类似的移动,从gtk_somethingg_something,例如gtk_signal_connectg_signal_connect

更新:

我搜索了一下,没有找到好的示例或教程。我找到的唯一片段在这里:g_action_map_add_action_entries

static void
activate_quit (GSimpleAction *simple,
               GVariant      *parameter,
               gpointer       user_data)
{
  exit (0);
}

static void
activate_print_string (GSimpleAction *simple,
                       GVariant      *parameter,
                       gpointer       user_data)
{
  g_print ("%s\n", g_variant_get_string (parameter, NULL));
}

static GActionGroup *
create_action_group (void)
{
  const GActionEntry entries[] = {
    { "quit",         activate_quit              },
    { "print-string", activate_print_string, "s" }
  };
  GSimpleActionGroup *group;

  group = g_simple_action_group_new ();
  g_action_map_add_action_entries (G_ACTION_MAP (group), entries, G_N_ELEMENTS (entries), NULL);

  return G_ACTION_GROUP (group);
}

这个例子使用 struct GActionEntry 来命名一个函数/操作,并通过 g_action_map_add_action_entries 将其添加到动作组中。

1
如Olaf所提到的,现在应该使用GAction。
将函数连接到操作实际上非常简单,您可以通过连接到“activate”信号来完成。
以下是一个小例子:
GSimpleAction *action = g_simple_action_new ("save", NULL);
g_signal_connect (G_OBJECT(action), "activate", saveFunction, userData);

你可以在这里阅读更多关于操作的信息


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接