【问题标题】:gtk+ 3.x key bindings - strugglinggtk+ 3.x 键绑定 - 苦苦挣扎
【发布时间】:2015-07-17 20:41:52
【问题描述】:

我已经尝试了一些方法,可能正在接近解决方案,但这里是...

在一个(可能实现的)小部件上,有没有人有一个很好的例子 GtkEntry 小部件接收 ALT+ DownCTRL + n 按键,这将引发 “新”信号,例如SIG-NEW 在小部件上。我知道如何用g_signal_connect 捕捉。

【问题讨论】:

    标签: c gtk


    【解决方案1】:

    我附加了一个最小的工作示例。

    重要的一点是将GtkEntry-instance 的key-press-event 连接到合适的回调。在该回调中,您必须提取 GdkEventKey 结构,它是作为回调函数参数的 GdkEvent 结构的成员。

    GdkEventKey 包含检查按下哪个键+修饰符所需的所有信息。

    由于我使用gtk+-3.0 测试了代码,您可能必须修改小部件的GdkEventMask 才能接收key-press-event。对于gtk+-3.0,这似乎已经是默认设置了。如果没有调用回调,您应该使用gdk_window_set_events () 启用它(当然您必须在小部件的 gdk 窗口中调用它)。

    #include <gtk/gtk.h>
    #include <glib.h>
    
    gboolean
    key_press_event_cb (GtkWidget * widget, GdkEvent * event,
                        gpointer data)
    {
        GdkEventKey key = event->key;
    
        /* check modifier key */
        /* on most keyboards GDK_MOD1_MASK is the Alt key */
        if (key.state == GDK_MOD1_MASK) {
    
            /* check for key that was pressed */
            switch (key.keyval) {
                case GDK_KEY_d:
                    g_print
                        ("`Alt-d` deletes the content in the entry box\n");
                    gtk_entry_set_text (GTK_ENTRY (widget), "");
                    break;
            }
    
        }
    
        /* check for unmodified key presses */
        switch (key.keyval) {
            case GDK_KEY_x:
                g_print
                    ("`x` deletes the content in the entry box\n");
                gtk_entry_set_text (GTK_ENTRY (widget), "");
                return TRUE;
                break;
        }
    
        return FALSE;
    }
    
    int
    main (int argc, char *argv[])
    {
        GtkWidget *window;
        GtkWidget *entry;
    
        gtk_init (&argc, &argv);
    
        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        entry = gtk_entry_new ();
    
        gtk_container_add (GTK_CONTAINER (window), entry);
        gtk_widget_show_all (window);
    
        g_signal_connect (window, "destroy",
                          G_CALLBACK (gtk_main_quit), NULL);
        g_signal_connect (entry, "key-press-event",
                          G_CALLBACK (key_press_event_cb), NULL);
    
        gtk_main ();
    
        return 0;
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-13
    • 2021-10-22
    相关资源
    最近更新 更多