При вводе в ячейку в wxGrid клавиши со стрелками используются для перемещения вперед и назад между символами. Однако, в зависимости от положения каретки, я хотел бы переместить курсор к следующей ячейке при нажатии клавиши со стрелкой. В настоящее время wxGrid сконфигурирован для захвата клавиши Enter, которая заставляет курсор двигаться вниз (в ячейку ниже).
Мой вопрос, как я могу захватить KeyEvent, когда редактор все еще отображается.
Мой подход:
void Grid::OnGridCmdEditorShown( wxGridEvent& event )
{
m_IsEditorShown=true;
//Connect(wxEVT_KEY_DOWN,wxKeyEventHandler(Grid::OnKeyDown),NULL, this); //This approach did not help either
event.Skip();
}
void Grid::OnKeyDown(wxKeyEvent& event)
{
if(m_IsEditorShown) wxMessageBox("You are keying");
event.Skip();
}
Когда появится редактор и скажу, что я печатаю abc
для текущей ячейки, MessageBox появляется только когда я нажимаю ввод. Как можно поймать KeyEvents, когда редактор все еще отображается, например, пользовательские типы a
в текущую ячейку и показывает MessageBox.
Один из способов, который работал для меня, — это подключить обработчик к каждому редактору сетки после его создания, добавив его в Grid
конструктор:
Bind(wxEVT_GRID_EDITOR_CREATED, [=](wxGridEditorCreatedEvent& event) {
event.GetControl()->Bind(wxEVT_KEY_DOWN, &Grid::OnKeyDown, this);
});
Это будет не обрабатывать начальное нажатие клавиши, которое приводит к показу редактора в первую очередь, но, насколько я понимаю, в этом нет необходимости.
Вам нужно использовать пользовательский редактор (вероятно, просто производный от стандартного wxGridCellTextEditor
) и привязать к wxEVT_CHAR
событие редактирования редактирования, созданного в его Create()
,
Обратите внимание, что если вы хотите обработать начальное нажатие клавиши, что приводит к отображению редактора в первую очередь, вам необходимо переопределить wxGridCellEditor::StartingKey()
вместо этого, когда нажатие этой клавиши происходит до того, как отображается элемент управления для редактирования.