c++ - 仅使用数值格式化 wx.TextCtrl - 浮点精度

标签 c++ visual-c++ wxpython wxwidgets

我创建了一个简单的应用程序,它使用带有 wxFILTER_NUMERIC 的纯 TextCtrl 小部件,以便仅接受数字值(请参阅下面的代码)。

我希望这些值具有固定的显示精度,无论用户如何输入它们(例如,在指定 17.0 或 17.000000 值的情况下将始终显示 17.0000)。我发现在 wxPython 中有一个选项可以使用派生的 NumCtrl 小部件(http://wxpython.org/docs/api/wx.lib.masked.numctrl-module.html),它可以完成这项工作,但我找不到它位于基本的 wxWidgets 库中。

那么,是否有一个现成的解决方案可以在某个地方找到,但我根本找不到,或者我必须编写一个函数,在插入数字后手动更改数字的格式(处理 EVT_TEXT 和 EVT_TEXT_ENTER 事件并修改输入字符串)?

到目前为止我所拥有的:

事件表

BEGIN_EVENT_TABLE(MyFrame, wxFrame) 
    EVT_MENU(ID_Quit, MyFrame::OnQuit)
    EVT_MENU(ID_About, MyFrame::OnAbout)
    EVT_TEXT(ID_textBox, MyFrame::ValueChanged)
    EVT_TEXT_ENTER(ID_textBox, MyFrame::ValueChanged)
END_EVENT_TABLE()

MyFrame 内文本框的实现

wxPanel *panel = new wxPanel(this, -1);

    _textBox1 = new wxTextCtrl(panel,
         ID_textBox, 
         "0.0000", 
         wxPoint(100, 100), 
         wxSize(80,20),
         wxTE_PROCESS_ENTER,
         wxTextValidator(wxFILTER_NUMERIC,&_myValue),
         wxTextCtrlNameStr); 

处理函数

void MyFrame::ValueChanged(wxCommandEvent& WXUNUSED(event))
{
    // modify the string or do something clever
}

采用的解决方案 感谢您的回答,问题已经解决。这是我的做法:

`

wxFloatingPointValidator<double> _val(2,&_myValue,wxNUM_VAL_ZERO_AS_BLANK);
    _val.SetRange(0.,100.);     // set allowable range

_textBox1 = new wxTextCtrl(panel,   // create a textCtrl
     ID_textBox, 
     "0.0000", 
     wxPoint(100, 30), 
     wxSize(80,20),
     wxTE_PROCESS_ENTER,
     _val,          // associate the text box with the desired validator
     wxTextCtrlNameStr); 

`

最佳答案

参见wxFloatingPointValidator在 wxWidgets 2.9 中可用。

关于c++ - 仅使用数值格式化 wx.TextCtrl - 浮点精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14428727/

相关文章:

c++ - 将数据写入由 CFileDialog 在 C++ 中创建的 .txt 文件

python - 在显示大型机之前从对话框获取用户输入

c++ - C++11 标准是否提供类似 boost::any 的东西?

c++ - 如何使用 enable_if 根据类的模板参数启用成员函数

c++ - 在 C++ 中将 char[] 数组转换为 LPCTSTR

C++ 指针机制 - 错误 2440

python - wxpython 仪表没有脉冲

linux - wxPython中的非轮询文件监控

c++ - Debian 上的 NetBeans 7.3 缺少 C/C++ 编译器

c++ - 如何将 s.st_dev 转换为/sys/block/<name>