create a .h file:
#include "CoreMinimal.h"
#include "Components/RichTextBlockDecorator.h"
#include "HyperLinkRichTextBlockDecorator.generated.h"
class FRichInlineHyperLinkDecorator : public FRichTextDecorator
{
public:
FRichInlineHyperLinkDecorator(URichTextBlock* InOwner, UHyperLinkRichTextBlockDecorator* decorator);
virtual bool Supports(const FTextRunParseResults& RunParseResult, const FString& Text) const override;
protected:
virtual TSharedPtr<SWidget> CreateDecoratorWidget(const FTextRunInfo& RunInfo, const FTextBlockStyle& TextStyle) const override;
FHyperlinkStyle linkstyle;
FSimpleDelegate del;
mutable FString idString;
};
//////////////////////////////////////////////////////////////////////////
UCLASS()
class MYTEST_API UHyperLinkRichTextBlockDecorator : public URichTextBlockDecorator
{
GENERATED_BODY()
public:
UHyperLinkRichTextBlockDecorator(const FObjectInitializer& ObjectInitializer);
virtual TSharedPtr<ITextDecorator> CreateDecorator(URichTextBlock* InOwner) override;
UPROPERTY(EditAnywhere, Category=Appearance)
FHyperlinkStyle style;
UFUNCTION(BlueprintNativeEvent)
void ClickFun();
};
and a .cpp file:
#include "HyperLinkRichTextBlockDecorator.h"
#include <Components/RichTextBlock.h>
#include <SRichTextHyperlink.h>
FRichInlineHyperLinkDecorator::FRichInlineHyperLinkDecorator(URichTextBlock* InOwner, UHyperLinkRichTextBlockDecorator* decorator)
: FRichTextDecorator(InOwner)
{
linkstyle = decorator->style;
del.BindLambda([=]() {
decorator->ClickFun();
});
}
bool FRichInlineHyperLinkDecorator::Supports(const FTextRunParseResults& RunParseResult, const FString& Text) const
{
if (RunParseResult.Name == TEXT("a") && RunParseResult.MetaData.Contains(TEXT("id")))
{
const FTextRange& IdRange = RunParseResult.MetaData[TEXT("id")];
idString = Text.Mid(IdRange.BeginIndex, IdRange.EndIndex - IdRange.BeginIndex);
return true;
}
return false;
}
TSharedPtr<SWidget> FRichInlineHyperLinkDecorator::CreateDecoratorWidget(const FTextRunInfo& RunInfo, const FTextBlockStyle& TextStyle) const
{
const bool bWarnIfMissing = true;
TSharedPtr<FSlateHyperlinkRun::FWidgetViewModel> model = MakeShareable(new FSlateHyperlinkRun::FWidgetViewModel);
TSharedPtr<SRichTextHyperlink> link = SNew(SRichTextHyperlink, model.ToSharedRef())
.Text(FText::FromString("link"))
.Style(&linkstyle)
.OnNavigate(del);
return link;
}
//////////////////////////////////////////////////////////////////////////
TSharedPtr<ITextDecorator> UHyperLinkRichTextBlockDecorator::CreateDecorator(URichTextBlock* InOwner)
{
return MakeShareable(new FRichInlineHyperLinkDecorator(InOwner, this));
}
void UHyperLinkRichTextBlockDecorator::ClickFun_Implementation()
{
if (GEngine) {
GEngine->AddOnScreenDebugMessage(-1, 20, FColor::Red, "click link");
}
}
UHyperLinkRichTextBlockDecorator::UHyperLinkRichTextBlockDecorator(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
}
and then use this decorator to create a blueprint
and then use this blueprint decorator like RichTextBlockImageDecorator:
good luck!
BTW,you can rewrite the click function in the blueprint and change the link style :