【问题标题】:wxScrolledWindow add and remove elementswxScrolledWindow 添加和删除元素
【发布时间】:2016-12-27 15:11:17
【问题描述】:

我有一个 wxScrolledWindow 对象,其中填充了元素(图片)(每个元素都添加了使用 dc.paint 的 ThumbNail 类)。我想用新的一次(不是相同的数字)动态更改元素(用户更改文件夹)。

如何清空 wxScrolledWindow 对象中的所有项目并重新放入新项目?然后重置滚动条。

    _ScrolThumbs = new wxScrolledWindow(_pMainPanel);

        wxGridSizer *m_swSizer = new wxGridSizer(1,1,0);
        _ScrolThumbs->SetSizer(m_swSizer);  // Sets the window to have the given layout sizer.
std::vector<ThumbNail*> _Thumbs;
        for(int i=0;i < FilePr::Instance()->GetNumThumbs() ;i++)
        {
            _Thumbs.push_back(new ThumbNail(_ScrolThumbs, PicName[i]));
            _ScrolThumbs ->GetSizer()->Add (_Thumbs[i], 1, wxALL|wxALIGN_CENTER_VERTICAL, 5);
        }

然后我尝试这样做(当按下按钮时):

    wxWindowList& lst = _ScrolThumbs->GetChildren();
    //if (!lst.empty())
    std::cout << lst.size() << '\n';
    while(!lst.empty()) //for(int i = 0; i < lst.size(); i++) //lst.size()
    {
        wxWindow *wnd = lst.back();
        wnd->Destroy();
    }

但是像我上面那样放回新元素是行不通的......

知道如何执行此操作或在网络上寻求帮助吗?谢谢!

【问题讨论】:

  • lst.back() 不会从列表中删除最后一个元素;你还需要做一个pop_back()。据我所知,while 循环将是一个无限循环(或者会在同一个指针上反复调用Destroy 造成混乱)。相反,您应该从 sizer 中删除子项:只需执行 _ScrolThumbs -&gt;GetSizer()-&gt;Clear(true);。添加新的孩子后,做一个_ScrolThumbs-&gt;Layout();。我不知道这会有多大帮助,因为您没有提供足够的信息来说明“不起作用”的含义。如果有帮助,我可以将这些放在答案中。
  • 离题:在用户代码中使用以下划线和大写字母开头的标识符在 C++ 中是非法的 - 这些是为实现保留的。
  • 非常感谢!!这可以解决问题:)。我将检查'_'。我猜是我在错误的位置捡到的。 (对不起,我不能给你正确答案奖)。是否有关于编写代码的良好做法的规则?
  • 规则不缺,这是肯定的 :-)。我想您可以从isocpp.org(如果您还没有的话)的常见问题解答和其他链接开始,然后从那里开始。 (您可能在阅读标准库代码时采用了下划线样式;该代码允许使用该组合,因为它是“实现”的一部分。它是故意这样做的,看起来很难看,正是因为其他代码不能; 它旨在避免与用户代码宏和其他奇怪的冲突)。

标签: c++ scrollbar wxwidgets dynamically-generated


【解决方案1】:
_ScrolThumbs->GetSizer()->Clear(true);
// or
_ScrolThumbs->DestroyChildren();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-05
    • 2019-03-23
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多