3

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

NumericEntry<int> int_entry(1,0,10);

它告诉我

数字常量前应有“,”或“...”

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

无法转换为小部件

使用时出错

functionname.pack_start(int_entry())

我想我的部分存在一个愚蠢的错误(C++ 和 Gtkmm 新手的错误组合),因此感谢您的帮助。

4

2 回答 2

3

只允许数字的一种方法是继承 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);
}
于 2012-04-23T14:56:10.650 回答
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);
于 2021-06-23T21:46:14.007 回答