在 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&amp; text) for(int i = 0; i &lt; 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: &gtk::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 不强制使用仅数字键盘

向量的长度包含来自 textInput 小部件的输入

无法在 Flutter TextField 小部件中垂直居中输入文本和后缀

如何在输入小部件中定位 x 以清除内容?