【问题标题】:Gtkmm Text Entry filtersGtkmm 文本输入过滤器
【发布时间】:2017-04-24 07:07:03
【问题描述】:

我现在正在做 Gtkmm GUI 编程,我是这种编程语言的新手。 如何让用户只在 Gtkmm Entry 文本框中输入数值。

【问题讨论】:

  • 关键事件必须自己处理。

标签: gtk gtkmm


【解决方案1】:

您需要为您的条目添加一个按键释放信号,例如这是我的条目“m_EntryAmount”

m_EntryAmount.signal_key_release_event().connect(sigc::mem_fun(*this, &Vente::entryKeyReleaseAmount));

并添加信号功能

bool Sales::entryKeyReleaseAmount(GdkEventKey* /* event */ )
{
    if(m_EntryAmount.get_text()!="" && is_number(m_EntryAmount.get_text()) ){ 
       //now the Entry is not empty and its a number
       //do what you want here 

    }else{

      //here the Entry is not a number you can just delete it
      m_EntryAmount.set_text("");
}
    return true;
}

并添加 is_number 函数

bool Vente::is_number(const string& s)
{
    return !s.empty() && std::find_if(s.begin(), 
        s.end(), [](char c) { return !std::isdigit(c); }) == s.end();
}

这只是一个简单的例子,你可以用自己的方式自己做

【讨论】:

  • 这应该可行,但我希望用户体验相当......不愉快。想象一下输入一长串数字,可能是通过从一张纸上读取它们(在财务数据中并不罕见),然后错误键入一个键(滑到 p 而不是 0 或其他)并兴高采烈地运行应用程序清除整个条目。不太好!另一种方法当然是过滤 presses,并且只屏蔽不被接受的字符。
  • 我知道这不是一个真正的解决方案,但它只是为了提供帮助
  • 修复您需要处理条目键 ( GdkEventKey ) 而不是条目本身的问题。或者存储旧值,如果有任何新字符,则返回它......有很多方法可以解决这个问题。
  • 您可能需要重新考虑您的解决方案。我可以轻松地绕过它,并在其中放入任何我想要的文本。进入 Gtk::Entry 的文本不仅可以使用键盘输入,还可以从剪贴板粘贴、辅助文本输入等... Gtk::EntryBuffer 具有信号 signal_inserted_text ,如果您需要过滤文本。
【解决方案2】:

使用 Gtk::SpinButton 而不是 Gtk::Entry 只允许数字输入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 2016-11-28
    相关资源
    最近更新 更多