【问题标题】:How can I capture the word over which a right click is made in GTK?如何在 GTK 中捕获右键单击的单词?
【发布时间】:2014-02-12 03:22:38
【问题描述】:

我有一个GtkTextView 小部件,我想在用户右键单击某个单词时显示一个自定义弹出菜单。为了显示适当的菜单,我需要知道那个位置是什么词。

像下面这样:

我正在阅读文档,但我还没有找到方法。

有人知道怎么做吗?

【问题讨论】:

    标签: c gtk


    【解决方案1】:

    我已经通过将来自GtkTextViewbutton-press-event 信号连接到创建菜单的函数来实现它

    g_signal_connect(text_view, "button-press-event", G_CALLBACK(right_click_menu), NULL);
    

    当事件不是由预期的按钮(右键单击)生成时,处理菜单创建的函数将忽略该事件

    if(event->button.button != 3)
        return FALSE;
    

    只需使用GdkEvent 传入的坐标调用gtk_text_view_window_to_buffer_coords 即可获得消息

    int x, y;
    gtk_text_view_window_to_buffer_coords(  GTK_TEXT_VIEW(text_view),
                                            GTK_TEXT_WINDOW_WIDGET,
                                            event->button.x,
                                            event->button.y,
                                            &x,
                                            &y                      );
    

    并使用

    请求迭代器
    GtkTextIter iter;
    gtk_text_view_get_iter_at_location(GTK_TEXT_VIEW(text_view), &iter, x, y);
    

    然后使用GtkTextIter 函数 (https://developer.gnome.org/gtk3/stable/GtkTextIter.html) 来确定单词边界。

    【讨论】:

      【解决方案2】:

      GTK+ 使用 Pango 库进行文本布局。 Pango API 提供了函数pango_layout_xy_to_index(),当在布局内给定坐标时,将为您提供创建布局所针对的文本的字节索引。

      使用此信息,您可以通过向前/向后搜索适当的标点符号来识别给定字符所在的单词。

      如果您使用GtkEntry 作为您的小部件,那么要将鼠标坐标从单击转换为布局坐标,则需要使用gtk_entry_get_layout_offsets() 来检索布局相对于小部件的位置。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多