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

如何在Godot Tool模式下完全禁用Entry Widget?

在Godot工具模式下锁定Entry Widget的问题

我尝试在Godot的Tool模式下锁定Entry Widget,编写了如下代码:

tool
extends Node

export(bool) var locked=false
export(String) var entry="" setget set_entry

func set_entry(new_val):
    if!(locked):
        entry=new_val

理论上,这应该能阻止对Entry Widget的任何修改,通过快速恢复为之前的值来营造禁用的假象,但实际操作中仍可自由输入,仅在切换节点并重新选中原节点后,值才会恢复到锁定前的状态。请问如何完全禁用它?(或许可以使用_set()方法?)

编辑:问题演示动图
问题演示动图


解决方案

你的代码问题在于setget回调在编辑器实时输入时不会立刻触发,只有焦点离开属性栏或节点时才会执行,所以输入过程中值不会被实时回滚。以下是几种可行的解决方式:

方法一:用_set()拦截属性赋值

_set()是Godot全局的属性赋值拦截器,编辑器模式下会实时响应属性修改请求。修改代码如下:

tool
extends Node

export(bool) var locked = false
export(String) var entry = ""

func _set(property: String, value: Variant) -> bool:
    # 当entry属性被修改且处于锁定状态时,拒绝赋值
    if property == "entry" and locked:
        return false
    # 其他属性交给父类处理
    return super._set(property, value)

方法二:监听编辑器属性变更通知

通过NOTIFICATION_EDITOR_PROPERTY_CHANGED通知,实时检测属性修改并回滚:

tool
extends Node

export(bool) var locked = false
export(String) var entry = "" setget set_entry

func set_entry(new_val):
    if!locked:
        entry = new_val

func _notification(what: int):
    if what == NOTIFICATION_EDITOR_PROPERTY_CHANGED and locked:
        # 强制恢复entry的原始值
        set("entry", entry)
        # 通知编辑器刷新属性显示
        notify_property_list_changed()

方法三:直接禁用控件交互(适用于继承自LineEdit的情况)

如果你的节点直接继承自LineEdit(对应Entry控件),可以直接禁用控件的编辑能力,从根源上阻止输入,同时优化视觉提示:

tool
extends LineEdit

export(bool) var locked = false setget set_locked

func set_locked(new_val: bool):
    locked = new_val
    # 禁用编辑功能
    editable =!locked
    # 锁定时灰化控件
    modulate = Color(1, 1, 1, 0.5 if locked else 1)

这种方式体验更好,用户能直观看到控件处于禁用状态,且无法输入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:50:31