在 Unreal Engine 的 C++ 开发中,UButton
、UEditableTextBox
和 FString
是非常常用的类型,分别用于处理按钮交互、文本输入和字符串操作。以下是它们的详细说明和使用场景:
1. UButton(按钮控件)
UButton
是 Unreal 中用于处理用户点击交互的 UI 控件类,继承自 UWidget
,通常在蓝图中创建 UI 后,在 C++ 中绑定事件。
核心功能
- 点击事件:通过
OnClicked
委托响应按钮点击。 - 状态控制:设置按钮是否可点击(
SetIsEnabled(bool)
)、是否可见(SetVisibility(ESlateVisibility)
)等。
常用操作示例
cpp
运行
// 绑定按钮(假设在蓝图中命名为"LoginButton")
UButton* LoginButton = Cast<UButton>(GetWidgetFromName(TEXT("LoginButton")));
// 绑定点击事件
if (LoginButton)
{
// 绑定点击后执行的函数(OnLoginClicked 是自定义函数)
LoginButton->OnClicked.AddDynamic(this, &ULoginWidget::OnLoginClicked);
// 设置按钮不可点击
LoginButton->SetIsEnabled(false);
// 隐藏按钮
LoginButton->SetVisibility(ESlateVisibility::Hidden);
}
// 点击事件处理函数
void ULoginWidget::OnLoginClicked()
{
UE_LOG(LogTemp, Log, TEXT("登录按钮被点击!"));
}
2. UEditableTextBox(可编辑文本框)
UEditableTextBox
用于接收用户输入的文本(如用户名、密码),继承自 UWidget
,支持文本变化监听和输入验证。
核心功能
- 文本获取 / 设置:通过
GetText()
获取输入文本,SetText(FText)
设置默认文本。 - 文本变化事件:通过
OnTextChanged
或OnTextCommitted
监听输入变化。 - 错误提示:通过
SetError(FString)
显示错误信息(如 "密码错误")。
常用操作示例
cpp
运行
// 绑定文本框(假设在蓝图中命名为"UsernameTextBox")
UEditableTextBox* UsernameTextBox = Cast<UEditableTextBox>(GetWidgetFromName(TEXT("UsernameTextBox")));
if (UsernameTextBox)
{
// 设置提示文本(未输入时显示)
UsernameTextBox->SetHintText(FText::FromString(TEXT("请输入用户名")));
// 设置默认文本
UsernameTextBox->SetText(FText::FromString(TEXT("默认用户")));
// 绑定文本变化事件(输入时实时触发)
UsernameTextBox->OnTextChanged.AddDynamic(this, &ULoginWidget::OnUsernameChanged);
// 显示错误提示
UsernameTextBox->SetError(TEXT("用户名不能为空!"));
}
// 文本变化事件处理函数
void ULoginWidget::OnUsernameChanged(const FText& NewText)
{
FString Username = NewText.ToString(); // 转换为 FString 处理
UE_LOG(LogTemp, Log, TEXT("当前输入:%s"), *Username);
}
3. FString(字符串类型)
FString
是 Unreal 中用于处理可变字符串的类,类似 C++ 标准库的 std::string
,但针对引擎做了优化,支持多平台和 Unicode。
核心特性
- 可变长度:可动态修改内容(与不可变的
FName
、FText
区分)。 - 丰富的字符串操作:拼接、分割、查找、转换等。
- 与其他类型转换:支持与
FText
(本地化文本)、FName
(高效标识符)互相转换。
常用操作示例
cpp
运行
// 初始化字符串
FString Username = TEXT("Player123");
FString Password = TEXT("123456");
// 字符串拼接
FString UserInfo = TEXT("用户:") + Username + TEXT(",密码:") + Password;
// 结果:"用户:Player123,密码:123456"
// 字符串比较(忽略大小写)
if (Username.Equals(TEXT("player123"), ESearchCase::IgnoreCase))
{
UE_LOG(LogTemp, Log, TEXT("用户名匹配!"));
}
// 分割字符串(按换行符)
FString Data = TEXT("Alice\n123");
TArray<FString> Lines;
Data.ParseIntoArrayLines(Lines); // Lines[0] = "Alice", Lines[1] = "123"
// 与 FText 转换(FText 用于 UI 显示,支持本地化)
FText DisplayText = FText::FromString(Username); // FString → FText
FString StrFromText = DisplayText.ToString(); // FText → FString
三者协同使用场景(以登录功能为例)
- 通过
UEditableTextBox
获取用户输入的用户名和密码(转换为FString
处理)。 - 点击
UButton
触发登录逻辑,用FString
验证用户名密码是否正确。 - 验证失败时,通过
UEditableTextBox::SetError
显示错误信息(错误文本为FString
)。
例如:
cpp
运行
void ULoginWidget::OnLoginClicked()
{
// 从文本框获取输入(FText → FString)
FString InputUser = UsernameTextBox->GetText().ToString();
FString InputPwd = PasswordTextBox->GetText().ToString();
// 验证逻辑(使用 FString 比较)
if (InputUser.IsEmpty() || InputPwd.IsEmpty())
{
UsernameTextBox->SetError(InputUser.IsEmpty() ? TEXT("用户名不能为空") : TEXT(""));
PasswordTextBox->SetError(InputPwd.IsEmpty() ? TEXT("密码不能为空") : TEXT(""));
}
else
{
// 登录成功逻辑
}
}
理解这三个类型的用法是开发 Unreal UI 交互功能的基础,尤其在处理用户输入、按钮交互和字符串处理时非常关键。