在更改Gtk :: Entry之前,我应该捕获什么信号才能获取Gtk :: Entry的文本?

时间:2013-08-28 02:27:28

标签: c++ gtk signals gtkmm

我正在使用gtkmm 3(运行Ubuntu 12.04 LTS)编写应用程序,现在正在使用Gtk :: Entry控件。

我找不到要捕获的正确信号,以便我可以在更改之前获取Gtk :: Entry缓冲区文本,并持续保存以记录更改。我知道在其他一些工具包中,提供了一个方便的钩子。 (我相信使用“影子缓冲区”。)

我必须抓住什么信号才能做到这一点?该信号的插槽签名是什么?是否支持此功能?

2 个答案:

答案 0 :(得分:3)

由于您要更改行为,因此最好从Gtk::Entry继承:

class ValidatedEntry : public Gtk::Entry {

    Glib::ustring last_valid;

    virtual void on_changed()
    {
        Glib::ustring text = get_text();
        if (... validation here ...)
            set_text(last_valid); // WARNING: will call this on_changed() again
        else
            last_valid = text;
        Gtk::Entry::on_changed(); // propagate down
    }
};

BUT

这违背了可用性,这就是为什么它不是内置行为。用户不会因为错误输入内容而不喜欢文本还原;他们可能会在他们意识到输入错误的角色之前击中退格。

您应该至少等到用户按下Enter键(例如signal_activate或覆盖on_activate()),或者做一些不那么激烈的事情,比如显示警告图标。

答案 1 :(得分:2)

您可以尝试GObject的“通知”信号。它与间谍一起使用。连接到“notify :: text”将调用您对“text”属性的每次修改的回调,但第一次更改可能是设置初始值的setter,然后您可以存储。值得一试。

否则,您可以尝试将其存储在第一次触发“insert-text”或“delete-text”信号上。如果这似乎有用,请给出一些反馈。

我也同意DanielKO:从可用性的角度来看,修改用户输入只是烦人和不好的做法。最好告诉她哪个字段错误,将焦点放在那里,和/或有一个按钮重置为默认值,但不强制对用户输入进行任何更改。