【问题标题】:gtkentry focus behaviourgtkentry 焦点行为
【发布时间】:2012-04-28 15:48:28
【问题描述】:

是否有任何现有机制让 GtkEntry 在获得焦点时将光标简单地定位在文本的末尾,而不是选择其内容被下一个键覆盖?必须添加一个信号处理程序来做这个基本的事情似乎很奇怪,但我在属性中找不到任何东西。

编辑:信号处理程序不起作用;无论我做什么,默认行为都会在我的处理程序运行后触发。这是我的 gtkd 代码;请注意,我在焦点事件处理程序中附加了一些文本,并且附加的文本也被选中:

class NoteView : Entry
{
  this(string text) {
    if (text) {
      setText(text);
    }
    setEditable(true);
    setCanFocus(true);

    addOnFocusIn(delegate bool(GdkEventFocus* f, Widget w) {
        // clear selection
        selectRegion(0, 0);
        // test to see whether the appended text gets selected too
        appendText("hello");
        setPosition(-1);
        // don't let any other handlers run
        return 1;
      }, ConnectFlags.AFTER);
  }
}

addOnFocusIn 方法在 gtkd Gtk.Widget api 中;它在内部调用g_signal_connect_data,理论上它应该尊重G_CONNECT_AFTER标志我正在传递它,但似乎没有。

Edit2:已解决 - grab-focus 处理程序正在执行文本选择,并在 focus-in-event 之后处理

【问题讨论】:

    标签: gtk gtkd gtkentry


    【解决方案1】:

    原来 GtkEntry 选择的是 grab-focus 信号上的文本,而不是 focus-in-event。工作代码:

    class NoteView : Entry
    {
      this(string text) {
        if (text) {
          setText(text);
        }
        setEditable(true);
        setCanFocus(true);
        setHasFrame(false);
    
        addOnGrabFocus(delegate void(Widget w) {
            selectRegion(0, 0);
            setPosition(-1);
          }, ConnectFlags.AFTER);   
      }
    }
    

    【讨论】:

      【解决方案2】:

      在文档中找不到任何内容。

      我猜他们认为,与默认行为不同的是,他们只是让人们用信号来做这件事,而不是为它提供属性。

      考虑创建一个 GtkEntry 的子类来展示您需要的行为。

      【讨论】:

        猜你喜欢
        • 2012-08-27
        • 1970-01-01
        • 2021-05-03
        • 1970-01-01
        • 1970-01-01
        • 2018-04-06
        • 1970-01-01
        • 2013-02-23
        • 2015-03-22
        相关资源
        最近更新 更多