wxWidgets против добавления в список wxChoice - PullRequest
0 голосов
/ 27 июня 2018

Я создаю базовый графический интерфейс для проекта колледжа, я использую 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++;
        }
    }
}

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

1 Ответ

0 голосов
/ 27 июня 2018

Мне нужно удалить старые элементы из списка выбора, а затем добавить новые, но я не могу найти, как это сделать

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

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

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

Один из вариантов - использовать 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;
        }
    }
    

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

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

...