c - 如何设置 Gearmenu 的一个元素不敏感?
问题描述
如果发出“加载失败”信号,我想设置齿轮菜单的一个元素不敏感。
struct GActionEntry {
const gchar *name;
void (* activate) (GSimpleAction *action,
GVariant *parameter,
gpointer user_data);
const gchar *parameter_type;
const gchar *state;
void (* change_state) (GSimpleAction *action,
GVariant *value,
gpointer user_data);
};
这就是我发现的(https://developer.gnome.org/gio/stable/GActionMap.html#GActionEntry),我也这样使用它:
const GActionEntry app_actions[] = {
{ "setAsHome", set_clicked , NULL, NULL, NULL, {0, 0, 0} },
{ "about", about_clicked, NULL, NULL, NULL, {0, 0, 0} }
};
我现在想将 set_clicked 设置为非活动状态,但我不知道该怎么做。我的意思是我知道如何为“加载失败”信号制作回调函数,但不知道如何将其设置为非活动状态。
int main (int argc, char **argv)
{
int status;
struct widget *w = g_malloc (sizeof (struct widget));
w->app = gtk_application_new ("org.gtk.dialog", G_APPLICATION_HANDLES_COMMAND_LINE);
g_signal_connect (w->app, "command-line", G_CALLBACK (activate), (gpointer) w);
g_action_map_add_action_entries (G_ACTION_MAP (w->app), app_actions,
G_N_ELEMENTS (app_actions), (gpointer) w);
status = g_application_run (G_APPLICATION (w->app), argc, argv);
g_object_unref (w->app);
// free the memory for the widgets struct
g_free (w);
w = NULL;
return status;
}
struct widget
{
GtkApplication *app;
GtkWidget *window;
GtkWidget *box;
GMenu *appmenu;
GMenu *editmenu;
GtkWidget *find;
GtkWidget *back;
GtkWidget *forward;
GtkWidget *home;
GtkWidget *entry;
GtkWidget *header;
GMenu *gearmenu;
GtkWidget *gearmenubutton;
GtkWidget *gearicon;
GtkWidget *status;
WebKitWebView *wv;
guint id;
const gchar *url;
const gchar *homedir;
gboolean success;
};
// create the gear menu button
w->gearmenubutton = gtk_menu_button_new();
w->gearicon = gtk_image_new_from_icon_name ("emblem-system-symbolic", GTK_ICON_SIZE_SMALL_TOOLBAR);
gtk_button_set_image (GTK_BUTTON (w->gearmenubutton), w->gearicon);
// create a menu for the gear button
w->gearmenu = g_menu_new();
g_menu_append (w->gearmenu, "_Set as Homepage", "app.setAsHome");
w->editmenu = g_menu_new();
g_menu_append (w->editmenu, "_About", "app.about");
g_menu_append_section (w->gearmenu, NULL, G_MENU_MODEL (w->editmenu));
gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (w->gearmenubutton),
G_MENU_MODEL (w->gearmenu));
g_object_unref (w->editmenu);
g_object_unref (w->gearmenu);
解决方案
在加载失败的回调中,您需要删除“setAsHome”:
g_action_map_remove_action(G_ACTION_MAP (w->app), "setAsHome"
加载失败信号也会在失败时发出,您将被重定向到错误消息页面。请记住,您的 load-change 信号将被发出 2 次,因为无法加载 url 而不是加载错误页面。
为了让它再次“敏感”,您需要再次将其添加到菜单中。
推荐阅读
- database - 如何在保持面包屑顺序的同时标准化面包屑路径?
- ruby-on-rails - 使用会话将参数值传递给另一个控制器
- python - 从一列中获取值作为减法变量
- c# - Linq Group By 和合并行
- apache-zookeeper - Curator Framework 设置的会话超时
- javascript - 更改表上元素的标题
- flutter - 如何为 BottomNavigationBar 设置背景颜色
- fullcalendar - 除非某个单词在标题完整日历中,否则阻止用户创建事件
- python - 如何模拟 PythonOperator 的 python_callable 和 on_failure_callback?
- django - 调用 PutObject 操作时发生错误 (AccessDenied):访问被拒绝?