我正在使用 gtkmm 3(运行 Ubuntu 12.04 LTS)编写一个应用程序,现在正在使用 Gtk::Entry 控件。
我找不到要捕获的正确信号,因此我可以在更改之前获取 Gtk::Entry 缓冲区文本,并将其保留以维护更改记录。我知道在其他一些工具包中,提供了一个钩子来帮助实现这一点。(我相信使用“阴影缓冲区”。)
我必须抓住什么信号才能做到这一点?该信号的插槽签名是什么?是否完全支持此功能?
由于您正在更改行为,因此最好继承自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()
),或者做一些不那么激烈的事情,比如显示一个警告图标。
您可以尝试 GObject 的“通知”信号。它与 spy 属性结合使用。连接到“notify::text”将为“text”属性的每次修改调用你的回调,但第一个更改可能是设置初始值的设置器,然后你可以存储它。值得一试。
否则,您可以尝试将其存储在第一次触发“插入文本”或“删除文本”信号时。如果这似乎可行,请给使用一些反馈。
我也同意 DanielKO:从可用性的角度来看,修改用户输入只是令人讨厌和不好的做法。最好告诉她哪个字段错了,把焦点放在那里,和/或有一个按钮来重置为默认值,但不要对用户输入进行任何更改。