Я создал простое приложение, которое использует голые виджеты TextCtrl с wxFILTER_NUMERIC, чтобы принимать только числовые значения (см. Код ниже).
Я хочу, чтобы значения имели фиксированную точность отображения независимо от того, как пользователь вводит их (например, всегда будет отображаться 17,0000 в случае указания значений 17,0 или 17,000000). Я обнаружил, что в 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.
Других решений пока нет …