与追加到wxChoice列表相反的wxWidgets

时间:2018-06-27 00:13:46

标签: c++ append codeblocks wxwidgets

我使用wxwidgets和代码块为大学项目构建了一个基本的GUI,因为使用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++;
        }
    }
}

如果还有更好的方法来执行这种动态GUI,请告诉我。预先感谢。

1 个答案:

答案 0 :(得分:1)

  

我必须从选择列表中删除旧项目,然后追加新项目,但我找不到解决方法

您可以使用wxChoice :: Clear()方法从选择控件中删除所有条目,也可以使用wxChoice :: Delete(unsigned int n)方法从控件中删除特定条目。

它们在documentation page的“从wxItemContainer继承的公共成员函数”部分下列出。

  

如果还有更好的方法来执行这种动态GUI,请告诉我。预先感谢。

一种选择是使用wxUpdateUIEvent,以便在主机空闲时更新选择。如果您要走那条路,我会

  1. 将名为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;
        }
    }
    

走这条路线的优点是,所有有关更新UI的逻辑都可以放在一个方法/事件处理程序中。如果您有几个控件可能需要动态更新,则特别好。

缺点是,当您的框架运行时,将对该事件处理程序进行大量调用,这可能会影响性能。这就是为什么我在上面的示例中使用m_choiceNeedsUpdate bool变量来保护更改选择控件的逻辑。