在Gtk :: Entry小部件中强制数字输入

时间:2012-04-23 11:23:13

标签: c++ gtkmm

我正在寻找一种可能的方法,只允许在Gtk :: Entry小部件中输入数字,而不依赖于SpinButtons。问题是,我找到了一个模板(link),但它不起作用。我可以沿着我的其他代码编译它,但是如果我想用

声明一个实例
NumericEntry<int> int_entry(1,0,10);
它告诉我

  

在数字常量

之前预期','或'...'

第二部分是,我不清楚如何打包这个条目,因为我得到了一个

  

无法转换为小部件

使用

时出现

错误

functionname.pack_start(int_entry())

我想我的部分有一个愚蠢的错误(C ++和Gtkmm新手的糟糕组合),所以任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:2)

仅允许数字的一种方法是继承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);
}

答案 1 :(得分:0)

这是一个没有子类化的解决方案。这是用 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);