当播放器在多行文本框中更改文本光标位置时,如何调用代码(例如函数)?

How can I have code called (e.g., a function) when the player changes text cursor position in a multiline text box?

我想为我的 UMG ui 使用 multiline editable box 小部件之类的东西,并在文本光标移动时以任何可能发生的方式发生一些事情。我如何才能在这些时候调用我的代码,以及我如何获得有关光标当前在文本中的位置的信息?

我在 SMultiLineEditableTextBox 石板 class 中看到有一个 OnCursorMoved function, which has a an FTextLocation& 参数。但是,似乎没有 UMG 小部件公开该功能,因此不清楚如何让 UMG 小部件使用该功能。

创建 UMultiLineEditableTextBox 的子 class,它具有与 OnCursorMoved 相同签名的函数。此 class 还需要覆盖 TSharedRef<SWidget> RebuildWidget():

#include "CoreMinimal.h"
#include "Components/MultiLineEditableTextBox.h"
#include "MyEditable.generated.h"

/**
 * 
 */
UCLASS()
class UMyEditable : public UMultiLineEditableTextBox
{
    GENERATED_BODY()
public:
    virtual TSharedRef<SWidget> RebuildWidget() override;

protected:
    virtual void HandleOnCursorMoved(const FTextLocation& InLocation);
};

在重写中,执行与 UMultiLineEditableTextBox 相同的操作 并且 OnCursorMoved 委托设置为上面声明的函数。使用 BIND_UOBJECT_DELEGATE(SMultiLineEditableText::FOnCursorMoved, [your function name])。然后,还定义您的函数并根据需要使用传入的 FTextLocation

#include "MyEditable.h"
#include "Widgets/SWidget.h"
#include "Widgets/Input/SMultiLineEditableTextBox.h"

TSharedRef<SWidget> UMyEditable::RebuildWidget()
{
    MyEditableTextBlock = SNew(SMultiLineEditableTextBox)
        .Style(&WidgetStyle)
        .TextStyle(&TextStyle)
        .AllowContextMenu(AllowContextMenu)
        .IsReadOnly(bIsReadOnly)
        //      .MinDesiredWidth(MinimumDesiredWidth)
        //      .Padding(Padding)
        //      .IsCaretMovedWhenGainFocus(IsCaretMovedWhenGainFocus)
        //      .SelectAllTextWhenFocused(SelectAllTextWhenFocused)
        //      .RevertTextOnEscape(RevertTextOnEscape)
        //      .ClearKeyboardFocusOnCommit(ClearKeyboardFocusOnCommit)
        //      .SelectAllTextOnCommit(SelectAllTextOnCommit)
        .VirtualKeyboardOptions(VirtualKeyboardOptions)
        .VirtualKeyboardDismissAction(VirtualKeyboardDismissAction)
        .OnTextChanged(BIND_UOBJECT_DELEGATE(FOnTextChanged, HandleOnTextChanged))
        .OnTextCommitted(BIND_UOBJECT_DELEGATE(FOnTextCommitted, HandleOnTextCommitted))
        .OnCursorMoved(BIND_UOBJECT_DELEGATE(SMultiLineEditableText::FOnCursorMoved, HandleOnCursorMoved))
        ;

    return MyEditableTextBlock.ToSharedRef();
}

void UMyEditable::HandleOnCursorMoved(const FTextLocation& InLocation)
{
    UE_LOG(LogTemp, Warning, TEXT("Cursor Moved!"));
}