WxWidgets вместо добавления в список wxChoice

Я создаю базовый графический интерфейс для студенческого проекта, использую wxwidgets и кодовые блоки, потому что C++ - мой удобный язык программирования. Однако я хочу изменить параметры в wxChoice, потому что эти параметры не должны быть всегда одинаковыми, это означает, что если я добавлю что-то в список выбора, а затем я хочу обновить список до полного другого списка, сначала я Мне нужно удалить старые элементы из списка выбора, а затем добавить новые, но я не могу найти, как это сделать. Вот мой код:

//Event
void TestFrame::OnChoice1Select(wxCommandEvent& event)
{
    fstream in;
    string str,str2;
    int i;

    //File where I store my list of lists
    in.open("Recursos/Carreras-LC.txt",ios::in);

    //Go to an specific line of the file where the list for the current choice is
    in=gotoLine(in,Choice1->GetSelection()+1);

    //Gets the line with the list
    getline(in,str,'\n');
    in.close();

    //Here is where I'll put the code to remove the current list of choices

    //My code to append the items from the list i got before
    i=0;
    while(str[i]!='\0'){
        if (str[i]==','){
            Choice2->Append(_(str2));
            i++;
            str2 = "";
        }else{
            str2+=str[i];
            i++;
        }
    }
}

Также, если есть лучший способ сделать такой динамический графический интерфейс, пожалуйста, сообщите мне. заранее спасибо.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
440
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

i have to remove the old items from the choice list and then append the new ones, but i cant find how to do that

Вы можете использовать метод wxChoice :: Clear () для удаления всех записей из элемента управления выбором, и вы можете использовать метод wxChoice :: Delete (unsigned int n) для удаления определенной записи из элемента управления.

Они перечислены в страница документации в разделе «Общедоступные функции-члены, унаследованные от wxItemContainer».

Also if there's a better way to do this kind of dynamic GUI please tell me. thanks in advance.

Один из вариантов - использовать wxUpdateUIEvent для обновления выбора, когда основной кадр находится в режиме ожидания. Если вы собираетесь пойти по этому пути, я бы

  1. добавьте член типа bool с именем m_choiceNeedsUpdate или что-то в этом роде и обработчик событий void OnUpdateUI(wxUpdateUIEvent& event) (или как вы хотите его назвать) в класс формы вашего приложения.
  2. Свяжите обработчик событий в конструкторе кадров с помощью вызова типа this->Bind(wxEVT_UPDATE_UI,&MyFrame::OnUpdateUI,this);
  3. Когда вы делаете что-то, что требует обновления выбора, вы можете организовать его обновление с помощью таких вызовов:

    m_choiceNeedsUpdate=true;
    this->UpdateWindowUI();
    
  4. Тело обработчика событий, в котором обновляется элемент управления выбором, может выглядеть примерно так

    void MyFrame::OnUpdateUI(wxUpdateUIEvent& event)
    {
        if (m_choiceNeedsUpdate)
        {
            //Update the choice control here (probably using the Clear/Delete methods)
            m_choiceNeedsUpdate=false;
        }
    }
    

Преимущество этого маршрута состоит в том, что вся логика, касающаяся обновления пользовательского интерфейса, может быть помещена в один метод / обработчик событий. Это особенно удобно, если у вас есть несколько элементов управления, которые могут нуждаться в динамическом обновлении.

Обратной стороной является то, что во время работы вашего фрейма будет происходить много вызовов этого обработчика событий, что потенциально может повлиять на производительность. Вот почему я защитил логику изменения элемента управления выбором с помощью переменной m_choiceNeedsUpdate bool в приведенном выше примере.

wxEVT_UPDATE_UI не предназначен для такого использования, он должен обновлять элемент управления напрямую, а не устанавливать флаг. Если вы сделаете именно это, будет менее запутанно просто использовать wxEVT_IDLE напрямую.
VZ. 27.06.2018 15:31

Другие вопросы по теме