This is fairly old, but the problem persists and I was unable to find a ready answer. I did create a function in a child of UWidgetComponent to enable setting the owner by ControllerId. This did result in being able to control which player’s screen the widget rendered. I used this with widgetComponets that are scaled by distance to the player and created a component for each local player beyond the first as needed. I have not used C++ much in a long while so someone else will have to chime in if there is an issue with this:
Header:
UFUNCTION(BlueprintCallable, Category = UserInterface)
void setOwner(const int32 ControllerId);
CPP:
//Set WidgetCompoenet Owner by ControllerId
void UOwnableWidgetComponent::setOwner(const int32 ControllerId)
{
if (!GetWorld()) return;
ULocalPlayer* InPlayer = GEngine->GetLocalPlayerFromControllerId(GetWorld(), ControllerId);
UWidgetComponent::SetOwnerPlayer(InPlayer);
};