首页 > 其他分享 >IMGUI快速入门

IMGUI快速入门

时间:2024-07-21 21:29:58浏览次数:14  
标签:控件 IMGUI 入门 button pyimgui ImGui imgui 快速 ID

资源大全

官方资源

  1. 源码+例子:ocornut/imgui: Dear ImGui: Bloat-free Graphical User interface for C++ with minimal dependencies (github.com)
  2. python绑定:pyimgui/pyimgui: Cython-based Python bindings for dear imgui (github.com)
  3. 调试IMGUI自身:调试工具 ·ocornut/imgui 维基 (github.com)
  4. 在线示例,可定位到代码:ImGui Manual (pthom.github.io)
  5. Getting Started · ocornut/imgui Wiki (github.com)

其它

每个控件都带图示例:ImGui 简单使用 - 无形深空 - 博客园 (cnblogs.com)

快速入门

使用vs打开下载的dear imgui,demo中13个project,他们之间没有差异,只是dx或opengl等版本不一样,示例代码在imgui_demo.cpp ShowDemoWindow

右键菜单(popups)

if (ImGui::BeginPopupContextItem()) // <-- use last item id as popup id
{
    selected = n;
    ImGui::Text("This a popup for \"%s\"!", names[n]);
    if (ImGui::Button("Close"))
        ImGui::CloseCurrentPopup();
    ImGui::EndPopup();
}
ImGui::SetItemTooltip("Right-click to open popup");

image-20240602161724930

阅读习惯:控件Label右置,如何左置?

image-20240602210226755

pyimgui.begin("test window")

# default label
pyimgui.input_int("default label", 0)

# left label
pyimgui.text("left label")
pyimgui.same_line()
pyimgui.input_int("##left label item", 0)

pyimgui.end()

中文处理

中文乱码

中文乱码:TO_UTF8_CSTR("显示或隐藏挂点及挂件"));

输入框无法输入中文

字体要支持中文,否则只能用英文输入法,对源码修改

imgui.InputText

TreeNodeEx vs TreeNode

有两种树控件,建议使用新版的TreeNodeEx ,下面解释下这两种树控件的区别

TreeNode

TreeNode是一个较旧的函数,它显示一个简单的树,没有交互性,如下所示,

img

TreeNodeEx

TreeNodeEx是一个较新的函数,它通过枚举支持大量选项,ImGuiTreeNodeFlags可用来设置当前选中状态

img

ImGuiTreeNodeFlags flag = ImGuiTreeNodeFlags_DefaultOpen;//树默认是打开的
if (HAS_CHILDREN)
{
    flags |= ImGuiTreeNodeFlags_Leaf;//没有子节点的就不显示箭头
}
flags |= ImGuiTreeNodeFlags_OpenOnArrow;//选择非叶节点不会切换选中状态
if (IS_SELECTED)
{
    flags |= ImGuiTreeNodeFlags_Selected; //高亮选中当前节点
}
if (ImGui::TreeNodeEx("root", flag)) //这里返回的bool是树节点是否处于打开状态,而不是点击状态
{
    // Call ImGui::TreeNodeEx() recursively to populate each level of children
  	if (ImGui::IsItemClicked())
    {
        // 当节点被点击时触发事件
    }
    ImGui::TreePop();  // 在结尾处必须要的
}  

资料:ImGui 树节点 •TreeNode与TreeNodeEx

布局Layout

有以下方法用来布局

  1. SameLine
  2. SetCursorX
  3. table或列

SameLine

// Aligned to arbitrary position. Easy/cheap column.
IMGUI_DEMO_MARKER("Layout/Basic Horizontal Layout/SameLine (with offset)");
ImGui::Text("Aligned");
ImGui::SameLine(150); ImGui::Text("x=150");
ImGui::SameLine(300); ImGui::Text("x=300");
ImGui::Text("Aligned");
ImGui::SameLine(150); ImGui::SmallButton("x=150");
ImGui::SameLine(300); ImGui::SmallButton("x=300");

image-20240603112503343

固定坐标,窗口拉大坐标也不改变

table

请使用新的table api,文档:新表 API (1.80 #3740 ·Ocornut/Imgui (github.com),支持功能如下:

  • 边框和奇数行/偶数行背景颜色选项,鼠标滑过的高亮
  • 隐藏特定的列,可以调整列的大小
  • 排序,每个表头都可以排序

可以看table / Advanced这个例子

image-20240603142730964

按钮无法点击(ID冲突)

https://github.com/ocornut/imgui/blob/master/docs/FAQ.md#q-why-is-my-widget-not-reacting-when-i-click-on-it

ImGui隐式维护ID,控件树中的控件路径被hash来标识一个控件

每个控件的接口一般都有label,是该控件的ID,ID可以是字符串(label参数),索引,或者指针

所以传空串就会导致无法交互,解决办法是用##XXX来标识,##后的内容在显示时被忽略

因为复杂的控件其实维护了状态,比如树节点,有开关状态,所以在帧之间需要标识,这个控件调用就是这个控件

错误示例

pyimgui.begin("test window")

# ID conflict
if pyimgui.button("button"): # ID = hash of ("test window", "button")
	IINFO("button1")

if pyimgui.button("button"): # ID = hash of ("test window", "button")
	IINFO("button2")

pyimgui.end()

这个示例中,两个button的Label(ID)都叫button,因为这个Label也是ID,相同ID冲突可能导致其中一个button无法响应点击事件或同时响应事件。

解决办法

Label中添加"##",##后的内容不会显示在面板上,可以在Label后添加"##ID"内容来做ID区分,如:

if pyimgui.button("button##foo1"):  # ID = hash of ("test window", "button##foo1")
	IINFO("button1")

if pyimgui.button("button##foo2"):  # ID = hash of ("test window", "button##foo2")
	IINFO("button2")

##和###

Label中,"##ID"后的内容不会显示在面板上

您可能需要使用“###”运算符构建一个字符串,以保留带有变量标签的常量 ID)

static char name[32] = "Label1";
char buf[64];
sprintf(buf, "Button: %s###Button", name); / ### operator override ID ignoring the preceding label
ImGui::Button(buf); //显示的是Button:Label1

双击事件

但是碰到个问题,在TreeNodeEx的子节点中添加双击后,无法默认选中这个节点

is_selected = False
def test():
    opened = imgui.TreeNodeEx(name, flags=flags)
    if imgui.Selectable(name,is_selected,imgui.ImGuiSelectableFlags_AllowDoubleClick):
        if imgui.IsMouseDoubleClicked() and getattr(entity, 'model', None): #双击显示与隐藏
            entity.model.visible = not entity.model.visible

FAQ

itempick的作用还需要再看看

标签:控件,IMGUI,入门,button,pyimgui,ImGui,imgui,快速,ID
From: https://www.cnblogs.com/zhaoqingqing/p/18314971

相关文章

  • 【深度学习入门项目】多层感知器(MLP)实现手写数字识别
    多层感知器(MLP)实现手写数字识别导入必要的包获得软件包的版本信息下载并可视化数据查看一个batch的数据查看图片细节信息设置随机种子定义模型架构Buildmodel_1Buildmodel_2TraintheNetwork(30marks)Trainmodel_1Trainmodel_1Visualizethetrainingprocess......
  • java入门—JDK下载、环境配置、IDEA开发工具使用
    JavaSE入门—初识Java、JDK开发环境下载、Path环境配置、IDEA开发工具下载、HelloWorld详解1.Java概述1.1Java发展概述1.2Java语言特点及应用1.3Java技术体系2.Java的开发环境(JDK)搭建2.1JDK的下载2.2JDK与JRE3.Java环境配置3.1path、JAVA_HOME环境变量配......
  • MySQL入门学习-SQL高级技巧.透视表
        在MySQL中,虽然没有直接提供像Excel中那样的透视表功能,但可以通过一些技巧来实现类似的效果。通常,我们可以使用聚合函数和'GROUPBY' 子句来创建数据的透视表。一、透视表的概念:    透视表是一种数据汇总和分析的工具,它可以将数据按照不同的维度进行......
  • MySQL入门学习-SQL高级技巧.Window Function
        在MySQL中,窗口函数(WindowFunction)是一种强大的分析工具,它可以在查询结果的基础上进行更复杂的计算和分析。一、窗口函数的概念:    窗口函数可以对查询结果的每一行数据,根据指定的分区(Partition)和排序规则(Order)进行计算。它可以在同一查询中同时返回基础......
  • Redis入门介绍
    目录Redis简介​编辑Redis下载与安装Redis服务启动与停止Redis数据类型字符串操作命令哈希操作命令列表操作命令集合操作命令有序集合操作命令通用命令在Java中操作RedisRedis的Java客户端SpringDataRedis使用方式 Redis简介Redis是一个基于内存的key-va......
  • Elasticsearch 入门实战(8)--REST API 使用二(Search API)
    本文继续上文(Elasticsearch入门实战(3)--RESTAPI使用一(CAT,Index,Document,IngestAPI))介绍ElasticsearchRESTAPI,相关的环境及软件信息如下:CentOS 7.6.1810、Elasticsearch8.13.4。1、SearchAPIs1.1、CountAPI(查询文档数量)语法:GET/<target>/_count样例:cu......
  • 【前端 01】HTML快速入门:构建你的第一个网页
    【前端01】HTML快速入门:构建你的第一个网页在Web开发的广阔世界中,HTML(HyperTextMarkupLanguage)是构建网页的基石。无论是简单的个人博客还是复杂的电子商务网站,HTML都是不可或缺的一部分。本文将带你快速入门HTML,通过编写你的第一个HTML文件,了解HTML的基本结构和一些重......
  • 快速排序和归并排序
    目录一、序言二、快速排序1.介绍2.思路3.代码实现三、归并排序1.介绍2.思路3.代码实现四、小结一、序言快速排序和归并排序是我认为很常用的两个排序,而很多人对此仍然存在一些疑问与不解,所以今天让我带大家重新回顾一下这两个排序的代码实现。二、快速排序1.......
  • # Redis 入门到精通(九)-- 主从复制
    Redis入门到精通(九)--主从复制(1)一、redis主从复制–主从复制简介1、互联网“三高”架构高并发高性能高可用2、你的“Redis”是否高可用?1)单机redis的风险与问题问题1.机器故障现象:硬盘故障、系统崩溃本质:数据丢失,很可能对业务造成灾难性打击结论:基本上会......
  • python入门课程Pro(2)--循环
    循环第1课for循环的基本操作1.循环2.遍历3.for循环遍历字典(1)遍历字典的键(2)遍历字典的值(3)遍历字典的键和值4.练习题(1)班级成绩单(2)最出名的城市(3)修改成绩(4)打招呼第2课for循环的复杂应用1.累加2.练习题(1)有多少个字母(2)零食支出(3)同学加油(4)被罚了(5)几条鱼几头羊(6)高分......