UE4 C++ SComboBox组件的使用

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();
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值