GUI滑块的动态数量,该数量更新具有回调中值的std ::向量



我正在尝试将动态数字的滑块添加到GUI窗口中,并根据每个滑块的变化方式更新具有值的std::vector<float>。GUI库使用回调,我可以成功地将其用于一个滑块(或在复制滑块代码20次,但这不是解决方案时(如何告诉每个滑块的可变寿命,它应该更新的向量中的哪个元素。

我使用的是纳米(或libigl,特别是使用纳米类(,但我认为问题实际上很通用,也应该适用于其他GUI框架或情况。

这是如何添加一个滑块的代码的简短版本,并且它更新my_values[0](请注意,我必须手动放置" 0"(:

int main(int argc, char *argv[])
{
  igl::viewer::Viewer viewer;
  std::vector<float> my_values(50);
  viewer.callback_init = [&](igl::viewer::Viewer& viewer)
    {
    nanogui::Slider* slider = new nanogui::Slider(viewer.ngui->window());
    slider->setCallback([&](float value) {
      my_values[0] = value; // this slider sets the value at element '0'
      });
    viewer.ngui->addWidget("0", slider);
    viewer.screen->performLayout();
    return false;
  };
  viewer.launch();
}

现在如前所述,在viewer.callback_init中,我现在想添加50个滑块,但显然我不想复制滑块及其回调代码50次。但是,我需要以某种方式传递my_values[i],即每个滑块将要更新的向量中的哪个元素。我尝试了类似此类的事情,因为在实际调用函数/回调的时候,变量value_id未定义:

int main(int argc, char *argv[])
{
  igl::viewer::Viewer viewer;
  std::vector<float> my_values(50);
  auto add_slider = [&](igl::viewer::Viewer& viewer, std::vector<float>& my_values, int value_id, std::string value_name)
    {   
    nanogui::Slider* slider = new nanogui::Slider(viewer.ngui->window());
    slider->setCallback([&](float value) {
      my_values[value_id] = value; // offending line, 'value_id' is not initialized
      // also I'm using 'value_name' to give the slider a name - code omitted
      });
    return slider;
  };
  viewer.callback_init = [&](igl::viewer::Viewer& viewer) {
    // Now add all 50 sliders (in a for-loop in real code obviously):
    viewer.ngui->addWidget("0", add_slider(viewer, 0, "0"));
    viewer.ngui->addWidget("1", add_slider(viewer, 1, "1"));
    // etc.
    viewer.screen->performLayout();
    return false;
  };
  viewer.launch();
}

我尝试了各种事情,使 value_id a(const(引用,甚至是 std::shared_ptr<int>(我知道,可怕(,但是仍然在线路my_values[value_id] = value;上始终不初始化value_id

我该如何完成?我的猜测是,它一定是GUI/回调编程中的众所周知的模式/解决方案,我还没有弄清楚。

,而不是将滑块值存储在std::vector<float>中,使用map<string, float>map<Slider*, float>。因此,每当调用回调时,您都会知道要更新哪个变量(通过滑块的地址或名称(。

map<Slider*, float> my_values;
slider->setCallback([&](float value) {
      my_values[slider] = value; 
      });