【问题标题】:wxWidgets 2.9 AutoComplete in wxComboBox custom EnterEventwxComboBox 自定义 EnterEvent 中的 wxWidgets 2.9 AutoComplete
【发布时间】:2012-07-11 08:08:14
【问题描述】:

我有一个关于 wxWidgets 2.9 和 wxComboBox 自动完成功能的问题。下面是我的事件表,它接受我的 ComboBox 的 ENTER 事件,在输入时我触发 OnComboEnter。如果这样做,我将无法从 AutoComplete 列表中选择一个项目,因为它直接对用户键入 ComboBox 的文本执行 OnComboEnter 方法。

BEGIN_EVENT_TABLE(LVFilterPanel, wxPanel)
   EVT_TEXT_ENTER(wxID_ANY, LVFilterPanel::OnComboEnter)
   EVT_CONTEXT_MENU(LVFilterPanel::OnComboContextMenu)
END_EVENT_TABLE()

我的 ComboBox 是这样声明的:

mFilterString = new wxComboBox(this, LV_FILTER_STRING, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, 0, wxTE_PROCESS_ENTER);

AutoComplet 是使用 wxWidgets 2.9 中的默认 AutoComplete 方法完成的:

mFilterString->AutoComplete(historyarr);

historyarr 是一个 wxArrayString,其中填充了用户之前输入的字符串。 OnComboEnter 方法如下所示:

void LVFilterPanel::OnComboEnter(wxCommandEvent& event) {
    wxCommandEvent ce(wxEVT_COMMAND_BUTTON_CLICKED, LV_FILTER);
    static_cast<wxButton*>(FindWindow(LV_FILTER))->Command(ce);
}

我现在的问题是,如何更改事件处理,使其能够先选择项目然后处理 OnComboEnter,以便用户能够先选择项目(或者可能无法在all 并直接按回车键启动事件和 OnComboEnter 方法)。 提前致谢。

你好,

罗因

【问题讨论】:

  • +1 表达良好的问题

标签: c++ event-handling wxwidgets


【解决方案1】:

如果您需要在标准处理发生后执行您的事件处理程序,通常的技巧是在您的事件处理程序中什么都不做(这意味着也调用event.Skip(),当然!)除了设置一些内部标志并检查这个EVT_IDLE 处理程序中的标志。如果已设置,则执行您需要的任何操作(例如 button-&gt;Command() 在您的情况下)并重置标志。

这种方法可确保在事件发生后“立即”运行处理程序,而不会干扰正常的事件处理。

【讨论】:

  • 这很好,谢谢你的回答。我想知道您是否还可以采取不同的方法来确定用户是否在 OnComboEnter 方法中的下拉列表中选择了一个对象(我认为这只是一个修改过的下拉列表,您通常会在单击时找到在 wxComboBox 的箭头上)然后决定:是否选择了 ComboBox 的 ChangeValue 项,如果没有直接触发输入文本的命令。我稍后可能会调查这种方法,因为您的方法效果很好!
【解决方案2】:

我有同样的问题,但是 wxTextCtrl,这是我的解决方案:

TextCtrl2 = new wxTextCtrl(this, ID_TEXTCTRL2, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_TEXTCTRL2"));

TextCtrl2->SetHint("Search...");
TextCtrl2->AutoComplete(m_AutoCompleteChoices);
TextCtrl2->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(StartFrame::OnKeyDown),NULL, this);


void StartFrame::OnKeyDown(wxKeyEvent& event)
{
    switch (event.GetKeyCode()) {
    case WXK_RETURN:
        QueryCache(TextCtrl2->GetValue()); // <- This is anything to do!
        break;
    }
    event.Skip();
}

我可以使用 wxSearchCtrl 但自动完成功能在该控件中不起作用,我不知道为什么。

【讨论】:

    猜你喜欢
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    相关资源
    最近更新 更多