UE4 C++ SComboBox组件的使用
SWJ_MainWidget.h
#include "CoreMinimal.h"
#include "Widgets/SCompoundWidget.h"
#include <SComboBox.h>
#include <SEditableText.h>
#include "WJ_SlateWidgetStyle.h"
/**
*
*/
typedef TSharedPtr <FString> FComboItemType; //重定义TSharedPtr<FString> 名字为 FComboItemType
class WJ_SLATE_API SWJ_MainWidget : public SCompoundWidget
{
public:
SLATE_BEGIN_ARGS(SWJ_MainWidget)
{}
SLATE_END_ARGS()
/** Constructs this widget with InArgs */
void Construct(const FArguments& InArgs);
//SComboBox的绑定函数
TSharedRef<SWidget> MakeWidgetForOption(FComboItemType InOption);
void OnSelectionChanged(FComboItemType NewValue, ESelectInfo::Type);
FText GetCurrentItemLabel() const;
//第二个下拉框的绑定函数
TSharedRef<SWidget> MakeWidgetForOptionTwo(FComboItemType InOption);
void OnSelectionChangedTwo(FComboItemType NewValue, ESelectInfo::Type);
FText GetCurrentItemLabelTwo() const;
//登录按钮点击响应事件
FReply LoginEvent();
private:
//获取样式实例
const struct FWJ_SlateStyle* WStyle;
TSharedPtr<SComboBox<FComboItemType>> OneComBox;
TSharedPtr<SComboBox<FComboItemType>> TwoComBox;
TSharedPtr<SEditableText> Passworld;
TSharedPtr<SButton> Login;
TSharedPtr<SButton> Canle;
//下拉框的参数
FComboItemType CurrentItem;
FComboItemType CurrentItemTwo;
TArray<FComboItemType> Options;
TArray<FComboItemType> OptionsTwo;
};
SWJ_MainWidget.Cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "public/Widget/SWJ_MainWidget.h"
#include "SlateOptMacros.h"
#include <SBorder.h>
#include <SButton.h>
#include "Public/Style/WJ_StyleSoure.h"
#include <SImage.h>
#include "Public/Widget/WJ_SlateWidgetStyle.h"
#include <STextBlock.h>
#include <SBoxPanel.h>
#include <SComboBox.h>
#include <Internationalization.h>
#include <Engine/Engine.h>
BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
void SWJ_MainWidget::Construct(const FArguments& InArgs)
{
//初始话样式实例
WStyle = &WJ_StyleSoure::Get().GetWidgetStyle<FWJ_SlateStyle>("BPWjStyle");
//给第一个下拉框添加Item
Options.Add(MakeShareable(new FString("Admin")));
Options.Add(MakeShareable(new FString("admim_b")));
Options.Add(MakeShareable(new FString("admim_c")));
//给第二个下拉框添加Item
OptionsTwo.Add(MakeShareable(new FString("Teacher")));
OptionsTwo.Add(MakeShareable(new FString("Student")));
CurrentItem = 0;
CurrentItemTwo = 0;
ChildSlot
[
SNew(SOverlay)
+SOverlay::Slot().HAlign(HAlign_Center).VAlign(VAlign_Center)
[
SNew(SBox).WidthOverride(800).HeightOverride(500)
[
SNew(SBorder).BorderBackgroundColor(WStyle->BorderColor).BorderImage(&WStyle->OneBursh)
[
SNew(SVerticalBox)
//第一个盒子
+SVerticalBox::Slot().FillHeight(1).Padding(FMargin(0,100,0,0))
[
SNew(SHorizontalBox)
+SHorizontalBox::Slot().HAlign(HAlign_Center).VAlign(VAlign_Center).Padding(FMargin(50,0,0,0)).FillWidth(1)
[
SNew(STextBlock).Text(NSLOCTEXT("mytext", "账号 Account ", "账号 Account")).Font(WStyle->Font_45)
]
+ SHorizontalBox::Slot().HAlign(HAlign_Fill).VAlign(VAlign_Fill).Padding(FMargin(50, 0, 50, 0)).FillWidth(2)
[
SAssignNew(OneComBox,SComboBox<FComboItemType>).OptionsSource(&Options).OnGenerateWidget(this,&SWJ_MainWidget::MakeWidgetForOption)
.OnSelectionChanged(this,&SWJ_MainWidget::OnSelectionChanged).InitiallySelectedItem(CurrentItem)
[
SNew(STextBlock).Text(this,&SWJ_MainWidget::GetCurrentItemLabel)
]
]
]
//第二个盒子
+ SVerticalBox::Slot().FillHeight(1).Padding(FMargin(0, 20, 0, 0))
[
SNew(SHorizontalBox)
+ SHorizontalBox::Slot().HAlign(HAlign_Center).VAlign(VAlign_Center).Padding(FMargin(50, 0, 0, 0)).FillWidth(1)
[
SNew(STextBlock).Text(NSLOCTEXT("mytext", "密码Passworld ", "密码Passworld")).Font(WStyle->Font_45)
]
+ SHorizontalBox::Slot().HAlign(HAlign_Fill).VAlign(VAlign_Fill).Padding(FMargin(50, 0, 50, 0)).FillWidth(2)
[
SAssignNew(Passworld,SEditableText).HintText(NSLOCTEXT("mytext", "请输入登录密码 ", "请输入登录密码")).Font(WStyle->PassworldFont_45)
]
]
//第三个盒子
+SVerticalBox::Slot().FillHeight(1).Padding(FMargin(0, 20, 0, 0))
[
SNew(SHorizontalBox)
+ SHorizontalBox::Slot().HAlign(HAlign_Center).VAlign(VAlign_Center).Padding(FMargin(50, 0, 0, 0)).FillWidth(1)
[
SNew(STextBlock).Text(NSLOCTEXT("mytext", "登录类型 Type ", "登录类型 Type")).Font(WStyle->Font_45)
]
+ SHorizontalBox::Slot().HAlign(HAlign_Fill).VAlign(VAlign_Fill).Padding(FMargin(50, 0, 50, 0)).FillWidth(2)
[
SAssignNew(TwoComBox, SComboBox<FComboItemType>).OptionsSource(&OptionsTwo).OnGenerateWidget(this, &SWJ_MainWidget::MakeWidgetForOptionTwo)
.OnSelectionChanged(this, &SWJ_MainWidget::OnSelectionChangedTwo).InitiallySelectedItem(CurrentItemTwo)
[
SNew(STextBlock).Text(this, &SWJ_MainWidget::GetCurrentItemLabelTwo)
]
]
]
//第四个盒子
+SVerticalBox::Slot().FillHeight(1).Padding(FMargin(0, 20, 0, 100))
[
SNew(SHorizontalBox)
+ SHorizontalBox::Slot().HAlign(HAlign_Fill).VAlign(VAlign_Fill).Padding(FMargin(100, 0, 0, 0)).FillWidth(1)
[
SAssignNew(Login,SButton).Text(NSLOCTEXT("mytext", "登录 Login ", "登录 Login ")).VAlign(VAlign_Center).HAlign(HAlign_Center).OnClicked(this,&SWJ_MainWidget::LoginEvent)
]
+ SHorizontalBox::Slot().HAlign(HAlign_Fill).VAlign(VAlign_Fill).Padding(FMargin(100, 0, 50, 0)).FillWidth(1)
[
SAssignNew(Canle,SButton).Text(NSLOCTEXT("mytext", "退出 Cancel ", "退出 Cancel")).VAlign(VAlign_Center).HAlign(HAlign_Center)
]
]
]
]
]
];
}
END_SLATE_FUNCTION_BUILD_OPTIMIZATION
void SWJ_MainWidget::OnSelectionChanged(FComboItemType NewValue, ESelectInfo::Type)
{
CurrentItem = NewValue;
}
FText SWJ_MainWidget::GetCurrentItemLabel() const
{
if (CurrentItem.IsValid())
{
return FText::FromString(*CurrentItem);
}
return FText::FromString("Fail");
}
TSharedRef<SWidget> SWJ_MainWidget::MakeWidgetForOption(FComboItemType InOption)
{
return SNew(STextBlock).Text(FText::FromString(*InOption));
}
//第二个下拉框处理函数
TSharedRef<SWidget> SWJ_MainWidget::MakeWidgetForOptionTwo(FComboItemType InOption)
{
return SNew(STextBlock).Text(FText::FromString(*InOption));
}
void SWJ_MainWidget::OnSelectionChangedTwo(FComboItemType NewValue, ESelectInfo::Type)
{
CurrentItemTwo = NewValue;
}
FText SWJ_MainWidget::GetCurrentItemLabelTwo() const
{
if (CurrentItemTwo.IsValid())
{
return FText::FromString(*CurrentItemTwo);
}
return FText::FromString("Fail");
}
FReply SWJ_MainWidget::LoginEvent()
{
FText PassWorldText = Passworld->GetText();
FString PT = PassWorldText.ToString();
if (PT ==FString("Admin")&&*CurrentItem==FString("Admin"))
{
GEngine->AddOnScreenDebugMessage(-1, 30, FColor::Red, FString::Printf(TEXT("登录成功")));
}
else
{
GEngine->AddOnScreenDebugMessage(-1, 30, FColor::Red, FString::Printf(TEXT("登录失败")));
}
return FReply::Handled();
}