簡體   English   中英

GUI滑塊的動態數量,可使用回調中的值更新std :: vector

[英]Dynamic number of GUI sliders which update an std::vector with values in callbacks

我正在嘗試向GUI窗口添加動態數量的滑塊,並根據每個滑塊的更改方式使用值更新std::vector<float> GUI庫使用回調,並且我可以為一個滑塊成功完成此操作(或將滑塊代碼復制和粘貼20次,但這不是解決方案),但是我在將滑塊創建到函數中時遇到了問題:變量生命周期存在問題如何告訴每個滑塊應更新向量中的哪個元素。

我正在使用nanogui(或專門使用nanogui的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成為(const)引用,甚至是std::shared_ptr<int> (我知道,這很可怕),但value_id始終不會在行my_values[value_id] = value;上初始化my_values[value_id] = value;

我該怎么做? 我的猜測是它必須是GUI /回調編程中的眾所周知的模式/解決方案,我只是還沒有弄清楚。

而不是將滑塊值存儲在std::vector<float> ,請使用map<string, float>map<Slider*, float> 因此,無論何時調用回調,您都將知道要更新哪個變量(通過滑塊的地址或名稱)。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM