【问题标题】:Gtk per widget accelerators每个小部件加速器的 Gtk
【发布时间】:2009-10-21 03:22:38
【问题描述】:

我构建了一个复合小部件,并希望它有自己的加速器(热键),只有在它处于焦点时才可用。到目前为止,我唯一的想法是在我的小部件进出焦点时更改顶层的加速器组。看来应该有更好的办法。

【问题讨论】:

    标签: c gtk


    【解决方案1】:

    每个小部件类都将指向其处理程序的指针作为小部件类结构的一部分公开。您可以在运行时修补它们,在调用 gtk_init() 之后但在进入应用程序的主循环之前。

    例如,您可以像这样修补 GtkFoo 的按键处理程序:

    static gboolean (*oldFooKeyPress)(GtkWidget* _widget, GdkEventKey* _event);
    ...
    GtkWidgetClass* fooClass = GTK_WIDGET_CLASS(g_type_class_ref(GTK_TYPE_FOO));
    oldFooKeyPress = fooClass->key_press_event;
    fooClass->key_press_event = myFooKeyPress;
    

    那么你可以这样写myFooKeyPress()

    static gboolean myFooKeyPress(GtkWidget* widget, GdkEventKey* event)
    {
        if (widget is one I am interested in &&
            event is a special accelerator for that widget)
        {
            do something special here
            and maybe return
        }
    
        return oldFooKeyPress(widget, event);
    }
    

    我记得,当您进行上述修补时,如果 Foo 小部件类尚未初始化,则调用 GTK_TYPE_FOO 将对其进行初始化。

    【讨论】:

      【解决方案2】:

      看来我需要使用键绑定而不是加速键

      http://library.gnome.org/devel/gtk/unstable/gtk-Bindings.html

      GtkTextView 的交叉引用显示了如何 http://www.koders.com/c/fid959C3555A3004EA74AD6E0276122FC19673F9912.aspx?s=sort

      【讨论】:

        【解决方案3】:

        这是类初始化函数,这是我正在寻找的解决方案

        static void
        webview_class_init (WebviewClass *klass)
        {
        
            GtkObjectClass *object_class = GTK_OBJECT_CLASS (klass);
        
            GtkBindingSet *binding_set;
        
            signals[ZOOM_IN] = g_signal_new_class_handler("zoom_in",
                            G_OBJECT_CLASS_TYPE (object_class),
                            G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
                            G_CALLBACK (webview_zoom_in),
                            NULL, NULL,
                            g_cclosure_marshal_VOID__VOID,
                            G_TYPE_NONE, 1,
                            G_TYPE_BOOLEAN, TRUE);
        
            binding_set = gtk_binding_set_by_class (klass);
        
            gtk_binding_entry_add_signal (binding_set, GDK_plus, GDK_CONTROL_MASK,
                            "zoom_in", 1,
                            G_TYPE_BOOLEAN, TRUE);
        
         }
        

        【讨论】:

          【解决方案4】:

          请参阅 this 以了解仅为焦点小部件实现加速器

          步骤:

          • 为您的特定小部件创建新的GSimpleActionGroupgtk_widget_insert_action_group
          • 将操作添加到新操作组中
          • 使用gtk_application_set_accels_for_action() 为该特定操作(名称)设置快捷方式。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-06-02
            相关资源
            最近更新 更多