ImGui unputText в цикле

Код создает поле ввода по кнопке, но вводить текст можно только в последний созданный, а так же текст введённый в последнее поле ввода отображается везде. Как исправить? За помощь - заранее спасибо!

int j = 1;
std::vector<float> my_var;
char buf[256];
for (int i = 0; i < j; i++)
                    {
                        ImGui::Text(u8"'Поле ввода: вопрос'");
                        if(ImGui::InputText("##Test", buf, IM_ARRAYSIZE(buf)))
                        {
                            std::string s(buf);
                            my_var.push_back(std::stod(s));
                        }
                        
                        ImGui::Text(u8"'Поле ввода: правильный ответ'");
                        ImGui::Text(u8"'Поле ввода: 'Кол-во баллов за правильный ответ'");
                        ImGui::Separator();
                    }
                    if (ImGui::Button(u8"Добавить вопрос"))
                    {
                        j++;
                    }

Ответы (1 шт):

Автор решения: HolyBlackCat

У разных виджетов должны быть разные имена. Используйте, например, ImGui::InputText(("##Test" + std::to_string(i)).c_str(), ...);.

Или, другой вариант, оберните тело цикла в ImGui::PushID(i); ... ImGui::PopID();, эффект будет похожий.


Непонятно, зачем вам ImGui::InputText, работающий с массивом байт. Есть ImGui::InputFloat, который читает сразу число.

Но даже если бы вам была нужна строка, а не число, то лучше использовать другую перегрузку ImGui::InputText из <misc/cpp/imgui_stdlib.h>, которая сразу работает с std::string *.


Также, push_back в теле if выглядит сомнительно. Разве он не срабатывает на каждое изменение отдельного символа? Лучше сделать отдельную кнопку, завершающую ввод числа, или передавать ImGuiInputTextFlags_EnterReturnsTrue, чтобы if срабатывал только при нажатии Enter.

→ Ссылка