I want to custom a scrollbox ,but I can not get the size of my scrollbox and the widget I put in it, I guess "I just want to get the size of a widget " that mey be a simple question, please! who can help me? and forgive my bad english.
Hello, libohan1312
To do this, you can use UUserWidget::SetDesiredSizeInViewport function:
UFUNCTION(BlueprintCallable, BlueprintCosmetic, Category="User Interface|Viewport")
void SetDesiredSizeInViewport (FVector2D Size)
Hope this helped!
Good luck!
Thinks , do you mean that get the size manually? can I get it dynamic in the running time? I hava extended the scrollbox, I want to get the size of the widget added in it.
Hey Libohan,
I may have found a way to get the size of a widget but its a little long winded to get there. Basically put your widget within a container, like a vertical or horizontal box. Make that container a variable so you can get it’s size.
I hope this helps
yes! I think it works , I find only canvas solt can get its children
s size, thanks.
this works perfect
Best way in cpp is
GetCachedGeometry().GetLocalSize()
Or in BPs :
I cannot open the BP link
Another way, one that worked best for me, was to use the “Get Scroll Offset Of End” node from my scrollbox and use that as a clamp on the offset I applied via my input.
Input * scrollSpeed + GetScrollOffset (current offset) → Clamped between 0 (top of scrollbox) and GetScrollOffsetOfEnd (end of scrollbox) → pipe return into SetScrollOffset node.
Blueprint : Get Cached Geometry (returns a Geometry), Get Local Size (takes in a geometry) …
Really nice one, thanks
Hello @anonymous_user_8e2766aa
Can you tell me how you can do that ?
Is it a node in a blueprint or it’s C++ ?
Thanks for your help
JD
It is works only after 1-2 frames after widget construction
In c++ you can use:
FVector2D WidgetSize = Widget->GetDesiredSize();
But if this widget is created in this frame you should wait frame before you be abble to use it. Other way you get WidgetSize = { 0 , 0 }.
To wait frame you can for example use FTimerHandle.
(1.) In .h file add to your UCLASS
bool HasWaitedFrame { false };
- And add function
void DoSomethingInNextFrame();
(2.) .cpp
void UYourClass ::DoSomethingInNextFrame();
{
if ( ! HasWaitedFrame )
{
FTimerHandle timerhandler;
GetWorld() ->GetTimerManager() .SetTimer( timerhandler , [ this ]() { HasWaitedFrame = true; DoSomethingInNextFrame( ); } , 0.01f , false );
}
else
{
FVector2D WidgetSize = Widget ->GetDesiredSize();
// Do something more
}
(3) All you must do is call this function when you want to DoSomethingInNextFrame
Legend