在 Gtk::Entry 小部件中强制输入数字
Posted
技术标签:
【中文标题】在 Gtk::Entry 小部件中强制输入数字【英文标题】:Force numeric input in a Gtk::Entry widget 【发布时间】:2012-04-23 11:23:12 【问题描述】:我正在寻找一种可能的方法,只允许在 Gtk::Entry 小部件中输入数字,而不依赖于 SpinButtons。问题是,我找到了一个模板(link),但它不起作用。我可以用我的其他代码编译它,但是如果我想声明一个实例
NumericEntry<int> int_entry(1,0,10);
它告诉我
数字常量前应为“,”或“...”
第二部分是,我不清楚如何打包这个条目,因为我得到了一个
无法转换为小部件
使用时出错
functionname.pack_start(int_entry())
我猜我有一个愚蠢的错误(C++ 和 Gtkmm 新手的错误组合),因此感谢您的帮助。
【问题讨论】:
哲学时刻:我从不喜欢这样限制输入。如果我已经在剪贴板上有我想要的号码,还有几个额外的字母,然后复制/粘贴它......然后我会删除这些号码?文本输入应该是文本输入——在你继续之前检查它,如果它不好就标记它——但不要编写会削弱标准小部件行为的脆弱钩子。你造成的问题比你解决的要多。 感谢这个想法,我会先看看我得到了什么。我对数字输入的推理是上下文:用户应该提供酶的动力学数据,并且始终是纯数字的,所以我认为只限制输入会更容易。 当我们从考虑如何限制输入转变为考虑如何处理输入时,我们可以用软件做很多事情。例如:ux.stackexchange.com/questions/2898/… 好的,我会看到我只是检查小部件中的输入,然后感谢您的帮助,很抱歉我有一段时间没有回复。有人可以结束这个问题吗? 【参考方案1】:只允许数字的一种方法是继承 Gtk::Entry 并覆盖 on_insert_text() 虚函数。在该虚函数中,您可以验证输入的文本,并且仅在文本验证时调用基类的 on_insert_text()。
void NumberEntry::on_insert_text(const Glib::ustring& text, int* position)
// allow only numbers to be entered
if (contains_only_numbers(text))
Gtk::Entry::on_insert_text(text, position);
【讨论】:
如果有人在努力定义“contains_only_numbers”函数...bool NumberEntry::contains_only_numbers(const Glib::ustring& text) for(int i = 0; i < text.length(); i++) if(Glib::Unicode::isdigit(text[i]) == false) return false; return true;
【参考方案2】:
这是一个没有子类化的解决方案。这是用 Rust 编写的,但在其他语言中应该也能正常工作。
fn is_non_ascii_digit(c: char) -> bool
!c.is_ascii_digit()
fn entry_disallow(entry: >k::Entry, pattern: fn(char) -> bool)
entry.connect_insert_text(move |entry, text, position|
if text.contains(pattern)
glib::signal::signal_stop_emission_by_name(entry, "insert-text");
entry.insert_text(&text.replace(pattern, ""), position);
);
// To use it
entry_disallow(&entry, is_non_ascii_digit);
【讨论】:
以上是关于在 Gtk::Entry 小部件中强制输入数字的主要内容,如果未能解决你的问题,请参考以下文章
TreeViewColumn标头中的PyGTK Entry小部件
从 Glade 文件构建时,Gtkmm 自定义小部件会引发错误
Flutter TextInputType.number 不强制使用仅数字键盘