当播放器在多行文本框中更改文本光标位置时,如何调用代码(例如函数)?
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!"));
}
我想为我的 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!"));
}