1

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

我找不到要捕获的正确信号,因此我可以在更改之前获取 Gtk::Entry 缓冲区文本,并将其保留以维护更改记录。我知道在其他一些工具包中,提供了一个钩子来帮助实现这一点。(我相信使用“阴影缓冲区”。)

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

4

2 回答 2

4

由于您正在更改行为,因此最好继承自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
    }
};

这违背了可用性,这就是为什么它不是内置行为。用户不会因为他们输错了东西而喜欢文本恢复;他们可能会在意识到输入错误的字符之前按退格键。

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

于 2013-08-28T06:06:02.390 回答
2

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

否则,您可以尝试将其存储在第一次触发“插入文本”或“删除文本”信号时。如果这似乎可行,请给使用一些反馈。

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

于 2013-08-28T13:56:41.243 回答