ImGui Button在for循环索引大于0时无法识别点击的问题
问题原因
ImGui 的所有控件都需要唯一标识符来区分,你循环里的所有按钮都使用相同的标签"More",导致ImGui无法识别不同按钮的点击事件,只会响应第一个匹配到的控件。
解决方法
给每个按钮添加唯一的ID即可,有两种常用方式:
方式1:给按钮标签添加唯一后缀
利用循环索引或对象ID生成唯一的按钮标签,通过##分隔显示文本和内部ID(##后的内容不会显示在界面上):
int Display(){ ImGui::Text("Object names:"); for(int i=0; i<obja.size(); i++){ // 注意:std::string需要调用c_str()转成const char*给ImGui::Text ImGui::Text("%s", obja.at(i).name.c_str()); ImGui::SameLine(); // 生成唯一按钮标签:显示"More",内部ID带索引i if(ImGui::Button(("More##obj_" + std::to_string(i)).c_str())){ system("xman"); // 这里可以根据i处理对应对象,比如获取obja.at(i)的详情 } ... } return 0; }
方式2:使用PushID/PopID包裹控件
在循环中给每个按钮推入一个唯一ID(比如循环索引、对象的id字段),ImGui会自动将这个ID附加到控件的标识符上:
int Display(){ ImGui::Text("Object names:"); for(int i=0; i<obja.size(); i++){ ImGui::Text("%s", obja.at(i).name.c_str()); ImGui::SameLine(); // 推入唯一ID,可以用索引i或对象的id ImGui::PushID(obja.at(i).id); if(ImGui::Button("More")){ system("xman"); // 处理当前对象逻辑 } ImGui::PopID(); // 弹出ID,避免影响后续控件 ... } return 0; }
额外注意点
原代码中ImGui::Text("%s", obja.at(i).name)存在潜在问题:std::string直接传给%s会导致未定义行为,必须调用c_str()方法转换为const char*,上面的示例已经修正了这个问题。
内容的提问来源于stack exchange,提问作者Tobias
相关产品推荐
相关产品推荐

