You should drop the TSubclassOf<class UButton> member variable as that is only necessary if you want to create the button in c++. Also, careful with the way you have named your variables. Both the TSubclassOf<class UButton> and the UButton* are named PlayButton in your code and that will definitely cause errors.
UButton* playButton = (UButton*)GetWidgetFromName(TEXT("PlayButton"));
This line of code will only be valid after the widget is Constructed. This has nothing to do with the c++ constructor. It is a term used by UMG that means that the underlying slate makeup of the UWidget is created. Once this occurs, all widgets exist in code and are available to be referenced.
This means that it will always fail in the default constructor, because the actual widget itself has not been created yet.
Move the code out of the constructor and into NativeConstruct.
It is also possible to expose the UButton pointer to Blueprint and set a reference to it in the widget blueprint instead of just referencing the widget by name.