显示 wxGrid 编辑器时如何捕获 KeyEvents

How to catch KeyEvents when wxGrid Editor is Shown

在 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 时,消息框仅在我按下 enter 时出现。当仍然显示编辑器时如何捕获 KeyEvents,例如,用户在当前单元格中键入 a 并显示 MessageBox。

您需要使用自定义编辑器(可能只是从标准 wxGridCellTextEditor 派生而来)并绑定到在其 Create() 中创建的编辑控件的 wxEVT_CHAR 事件。

请注意,如果您想要处理初始按键,这会导致首先显示编辑器,则需要覆盖 wxGridCellEditor::StartingKey(),因为此按键发生在显示编辑控件之前.

对我有用的一种方法是在每个网格编辑器创建后将处理程序连接到它,方法是将其添加到 Grid 构造函数中:

Bind(wxEVT_GRID_EDITOR_CREATED, [=](wxGridEditorCreatedEvent& event) {
        event.GetControl()->Bind(wxEVT_KEY_DOWN, &Grid::OnKeyDown, this);
    });

这将不会处理导致首先显示编辑器的初始按键操作,但据我了解,这在这里没有必要。