You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ImGUI拖拽自定义Texture::data数据获取异常问题求助

问题分析与修复

核心错误:接收端的Payload数据访问方式完全错误

你在接收拖拽数据时,错误地将ImGuiPayload*指针的地址当成了数据地址,而正确的做法是访问ImGuiPayload结构体的Data成员——这才是你通过SetDragDropPayload传入的数据指针。

你的接收端代码中:

auto* f = (Texture::data *) &x;

这行代码把ImGuiPayload*类型的x的地址强制转换成了Texture::data*,相当于读取了指针变量本身的内存值,自然得到异常的乱码数值。

修正后的接收端代码

ImGui::Image((void*)2, ImVec2{windowSize.x, windowSize.y}, {0, 1}, {1, 0});

if (ImGui::BeginDragDropTarget())
{
    const ImGuiPayload* payload = ImGui::AcceptDragDropPayload("TEXTURE");
    if (payload)
    {
        // 直接访问payload->Data获取拖拽的数据指针
        const Texture::data* dropped_tex = static_cast<const Texture::data*>(payload->Data);
        std::cout << "DROPPED TEX: " << dropped_tex->ID << '\n';
    }
    ImGui::EndDragDropTarget();
}

额外注意事项

  • 发送端参数验证:确保text确实是Texture::data类型,且sizeof(Texture::data)传入的大小准确匹配结构体实际大小。
  • 数据生命周期:拖拽操作是跨帧的,要保证&text指向的内存在拖拽完成前始终有效。如果texts是局部栈变量,拖拽过程中该内存可能被释放,导致访问非法内存。建议将纹理数据存储在全局容器、类成员变量等生命周期足够长的位置。
  • 类型安全:尽量使用static_cast而非C风格强制转换,避免潜在的类型转换错误。

内容的提问来源于stack exchange,提问作者notfynnaf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 20:25:01