版权声明:本文为博主原创文章,未经博主允许不得转载。blog.liujunliang.com.cn https://blog.csdn.net/qq_33747722/article/details/82989723
总体来说本文会解决两种问题
TSharedPtr<SWindow> Window;
SAssignNew(Window, SWindow)
[
SNew(MyWidget)
];
FSlateApplication::Get().AddModalWindow(Window.ToSharedRef(), GEngine->GameViewport->GetWindow());
这里的MyWidget是继承自SCompoundWidget窗口类
第一种是在ModalWindow无法进行网络服务请求
解决这种问题在MyWidget的Construct函数中添加一下函数
void MyWidget::Construct(const FArguments& InArgs)
{
TickEvent();
}
void MyWidget::TickEvent()
{
FSlateApplication::Get().GetOnModalLoopTickEvent().AddLambda([](float DeltaTime)
{
FTickableGameObject::TickObjects(nullptr, LEVELTICK_All, false, DeltaTime);
FHttpModule::Get().GetHttpManager().Tick(DeltaTime);
});
}
第二种是数据无法更新(只有在鼠标移动状态下才能更新)问题
Slate为了节省没必要要开销的性能(大多数UI的是在有交互的情况下重绘的)
因此需要手动注册界面的更新/激活状态
void MyWidget::Construct(const FArguments& InArgs)
{
RegisterActiveTimer(0.3f, FWidgetActiveTimerDelegate::CreateSP(this,&SLoadShapeWidget::ActiveTick));
}
EActiveTimerReturnType MyWidget::ActiveTick(double InCurrentTime, float InDeltaTime)
{
return EActiveTimerReturnType::Continue;
}