我正试图用C编写一个GTK+3应用程序。
我创建了一个glade文件,它的id是'track s\u deck.add\u empty\u 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。
我该如何将a c函数连接到那个动作?!
关于这个问题的任何想法都将不胜感激。
最佳答案
从GtkAction
说明
在GTK+3.10中,GTK操作已被弃用改为使用GAction,并将操作与GtkActionable小部件相关联使用GMenuModel创建带有gtk_menu_new_from_model()的菜单。
所以,似乎要从GtkAction
切换到GAction
。
我见过类似的从gtk_something
到g_something
的移动,例如gtk_signal_connect
和g_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
的动作组中。