Gtkmm文本输入过滤器

Gtkmm文本输入过滤器,gtk,gtkmm,Gtk,Gtkmm,我现在正在做Gtkmm GUI编程,我是这个编程语言的新手。 如何允许用户仅在Gtkmm输入文本框中输入数值。您需要为您的输入添加一个按键释放信号,例如,这是我的输入“m_EntryAmount” 并增加了信号功能 bool Sales::entryKeyReleaseAmount(GdkEventKey* /* event */ ) { if(m_EntryAmount.get_text()!="" && is_number(m_EntryAmount.get_text

我现在正在做Gtkmm GUI编程,我是这个编程语言的新手。
如何允许用户仅在Gtkmm输入文本框中输入数值。

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

并增加了信号功能

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;
}
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();
}
并添加is_number函数

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;
}
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
或其他什么),然后让应用程序愉快地清除整个输入。不好!当然,另一种选择是使用压滤机,只是阻止不可接受的字符。我知道这不是一个真正的解决方案,但它只是帮助您修复您需要处理的是条目键(GdkEventKey),而不是条目本身。或者存储旧的值,如果有新的字符。。。有很多方法可以解决这个问题。你可能需要重新考虑你的解决方案。我可以很容易地绕过它,并有任何文本,我想把它。进入Gtk::Entry的文本不仅可以使用键盘输入,还可以从剪贴板粘贴、辅助文本输入等。。。Gtk::EntryBuffer具有插入的信号文本,如果需要过滤文本,则需要连接该文本。