1

Тема: Взаємодія з wxCombobox

Намагаюся змусити реагувати wxCombobox на ведення тексту з клавіатури.
Ось частина коду пов'язана з ним і прив'язкою до введення тексту:

search_listbox = new wxComboBox(toolbar, ID_COMBOBOX_INPUT, wxT(""),
                                    wxDefaultPosition, wxSize(250, 30),
                                    strings,
                                    wxCB_SORT);

Bind(wxEVT_KEY_DOWN, &MainFrame::on_word_search_key_press,
         this, ID_COMBOBOX_INPUT);

void MainFrame::on_word_search_key_press(wxKeyEvent& event)
{
    search_listbox->Clear();
    event.Skip();
}

Але комбобокс ніяк не реагує на натискання клавіш.
Знаю, я десь помилився, але ніяк не зрозумію де.
Події(event) правильно вказані у методі та прив'язці(Bind)?

2

Re: Взаємодія з wxCombobox

Ем... Тобто, ще раз, у вас є комбобокс з порожнім текстом (wxT("")), який при натисканні будь-якої клавіші (wxEVT_KEY_DOWN) має очистити свій текст (search_listbox->Clear()) і вимкнути подальшу обробку події (event.Skip()), усе правильно?

А як саме ви дізнаєтеся, що воно не реагує на натискання клавіш?

3

Re: Взаємодія з wxCombobox

koala написав:

Ем... Тобто, ще раз, у вас є комбобокс з порожнім текстом (wxT("")), який при натисканні будь-якої клавіші (wxEVT_KEY_DOWN) має очистити свій текст (search_listbox->Clear()) і вимкнути подальшу обробку події (event.Skip()), усе правильно?

А як саме ви дізнаєтеся, що воно не реагує на натискання клавіш?

Там ще є strings, це масив, що заповнює випадний перелік(listbox) цього комбобокса.
Саме він і очищується. Я перевіряв очищення через іншу функцію, усе добре працює.

4

Re: Взаємодія з wxCombobox

Ось як треба було:

Bind(wxEVT_TEXT, &MainFrame::on_word_search_key_press,
         this, ID_COMBOBOX_INPUT);

void MainFrame::on_word_search_key_press(wxCommandEvent& event)
{
    wxArrayString strings;
    strings.Add(wxT("First string"));
    strings.Add(wxT("Second string"));
    strings.Add(wxT("Third string"));
    strings.Add(wxT("Fourth string"));
    strings.Add(wxT("Fifth string"));
    strings.Add(wxT("Sixth string"));
    strings.Add(wxT("Eight string"));
    if (!search_listbox->IsTextEmpty())
        search_listbox->AutoComplete(strings);
}

Виявляється там уже є функція автозавершення слів(AutoComplete()).
Бо я збирався наново її писати, звик до Tkinter.
В Tkinter, по суті, майже самі функції, а в wxwidgets — класи.
Тому треба бути уважним щодо методів, які успадковуються.
wxCombobox — це поєднання wxTextEntry та wxListbox, де успадковано методи цих двох класів.
Щодо подій(events), то треба було перехоплювати зміни в полі введення комбобокса,
а не натискання клавіш.

Подякували: koala, leofun012

5 Востаннє редагувалося leofun01 (06.09.2023 00:56:36)

Re: Взаємодія з wxCombobox

Vitaliy_Danmer написав:

Виявляється там уже є функція автозавершення слів(AutoComplete()).
Бо я збирався наново її писати...

Класичний приклад того як користувач [з початку] описав не те що він хоче отримати в результаті, а те що намагається робити в даний момент: В першому повідомленні не було згадки про автозавершення/автодоповнення.