【UE】富文本块(RichTextBlock) 增加超链接支持

这篇具有很好参考价值的文章主要介绍了【UE】富文本块(RichTextBlock) 增加超链接支持。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

RichTextBlock使用方式参考官方文档:RichTextBlockUE
文档中描述了不同样式文字以及图片的使用,但没有具体说明超链接的实现,但库中有hyperlink结构。
因此照猫画虎实现,仿照RichImgDecorator实现。

  • 首先在build.cs 里增加Slate引用
		PrivateDependencyModuleNames.AddRange(
			new string[]
			{ 
				"UMG",
				"Slate",
				"SlateCore",
			});
  • 编写SRichTextHyperlink_Ex.h文件 基于SRichTextHyperlink的拓展,增加点击回调href连接地址。
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once

#include "CoreMinimal.h"
#include "SlateGlobals.h"
#include "Input/Reply.h"
#include "Layout/Margin.h"
#include "Styling/SlateTypes.h"
#include "Framework/Text/SlateHyperlinkRun.h"
#include "Widgets/DeclarativeSyntaxSupport.h"
#include "Styling/CoreStyle.h"
#include "Widgets/Input/SHyperlink.h"

class FWidgetViewModel;
enum class ETextShapingMethod : uint8;
DECLARE_DELEGATE_TwoParams(FHyperlinkDelegate,FString ,FString);
#if WITH_FANCY_TEXT

class SRichTextHyperlink_Ex : public SHyperlink
{
public:

	SLATE_BEGIN_ARGS(SRichTextHyperlink_Ex)
	: _Text()
	, _Href()
	, _Type()
	, _Style(&FCoreStyle::Get().GetWidgetStyle< FHyperlinkStyle >("Hyperlink"))
	, _TextStyle(nullptr)
	, _UnderlineStyle(nullptr)
	, _Delegate()
	, _Padding()
	, _OnNavigate()
	, _TextShapingMethod()
	, _TextFlowDirection()
	{}

	SLATE_ATTRIBUTE( FText, Text )
	SLATE_ARGUMENT( FString , Href )
	SLATE_ARGUMENT( FString , Type )
	SLATE_STYLE_ARGUMENT( FHyperlinkStyle, Style )
	SLATE_STYLE_ARGUMENT( FTextBlockStyle, TextStyle )
	SLATE_STYLE_ARGUMENT( FButtonStyle, UnderlineStyle )
	SLATE_ATTRIBUTE( FMargin, Padding )
	SLATE_EVENT( FSimpleDelegate, OnNavigate )
	SLATE_EVENT( FHyperlinkDelegate, Delegate )
	SLATE_ARGUMENT( TOptional<ETextShapingMethod>, TextShapingMethod )
	SLATE_ARGUMENT( TOptional<ETextFlowDirection>, TextFlowDirection )
	SLATE_END_ARGS()

public:

	void Construct( const FArguments& InArgs, const TSharedRef< FSlateHyperlinkRun::FWidgetViewModel >& InViewModel );
	

	FReply OnClicked () const;
	
	


	virtual void OnMouseEnter( const FGeometry& MyGeometry, const FPointerEvent& MouseEvent ) override
	{
		SHyperlink::OnMouseEnter( MyGeometry, MouseEvent );
		ViewModel->SetIsHovered( true );
	}

	virtual void OnMouseLeave( const FPointerEvent& MouseEvent ) override
	{
		SHyperlink::OnMouseLeave( MouseEvent );
		ViewModel->SetIsHovered( false );
	}

	virtual FReply OnMouseButtonDown( const FGeometry& MyGeometry, const FPointerEvent& MouseEvent ) override
	{
		FReply Reply = SHyperlink::OnMouseButtonDown( MyGeometry, MouseEvent );
		ViewModel->SetIsPressed( bIsPressed );

		return Reply;
	}

	virtual FReply OnMouseButtonUp( const FGeometry& MyGeometry, const FPointerEvent& MouseEvent ) override
	{
		FReply Reply = SHyperlink::OnMouseButtonUp( MyGeometry, MouseEvent );
		ViewModel->SetIsPressed( bIsPressed );

		return Reply;
	}

	virtual bool IsHovered() const override
	{
		return ViewModel->IsHovered();
	}

	virtual bool IsPressed() const override
	{
		return ViewModel->IsPressed();
	}


private:
	FHyperlinkDelegate HyperDelegate;
	FString Href ;
	FString Type ;
	TSharedPtr< FSlateHyperlinkRun::FWidgetViewModel > ViewModel;
};


#endif //WITH_FANCY_TEXT

  • UHyperlinkRichTextBlockDecorator.h
// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "RichTextBlockDecorator.h"
#include "SRichTextHyperlink_Ex.h"
#include "HyperlinkRichTextBlockDecorator.generated.h"



USTRUCT(Blueprintable, BlueprintType)
struct CLOUDGAME_API FRichHyperlinkRow : public FTableRowBase
{
	GENERATED_USTRUCT_BODY()

public:
	UPROPERTY(EditAnywhere, Category = Appearance)
	FHyperlinkStyle HlStyle;
};


/**
 * 
 */
UCLASS(Abstract, Blueprintable)
class CLOUDGAME_API UHyperlinkRichTextBlockDecorator : public URichTextBlockDecorator
{
	GENERATED_BODY()
public:
	UHyperlinkRichTextBlockDecorator(const FObjectInitializer& ObjectInitializer);
	
	virtual TSharedPtr<ITextDecorator> CreateDecorator(URichTextBlock* InOwner) override;
	
	virtual const FHyperlinkStyle* FindHyperlinkStyle(FName TagOrId, bool bWarnIfMissing);
	
	void OnClickHyperlink(FString Type,FString Href);
protected:
	FRichHyperlinkRow* FindHyperlinkRow(FName TagOrId, bool bWarningIfMissing);
	
	UPROPERTY(EditAnywhere, Category = Appearance, meta = (RequiredAssetDataTags = "RowStructure=RichHyperlinkRow"))
	class UDataTable* HyperlinkSet;
	
};

  • FHyperlinkRichTextDecorator.h
#pragma once

#include "CoreMinimal.h"
#include "HyperlinkRichTextBlockDecorator.h"

/**
 * 
 */
class CLOUDGAME_API FHyperlinkRichTextDecorator : public FRichTextDecorator
{
public:
	FHyperlinkRichTextDecorator(URichTextBlock* InOwner, UHyperlinkRichTextBlockDecorator* InDecorator);
	virtual bool Supports(const FTextRunParseResults& RunParseResult, const FString& Text) const override;
protected:
	virtual TSharedPtr<SWidget> CreateDecoratorWidget(const FTextRunInfo& RunInfo, const FTextBlockStyle& TextStyle) const override;
private:
	UHyperlinkRichTextBlockDecorator* Decorator;
	FHyperlinkDelegate HlDelegate;
	FString ParseName = FString("a");

};
  • SRichTextHyperlink_Ex.cpp
#include "UMG/Hyperlink/SRichTextHyperlink_Ex.h"






void SRichTextHyperlink_Ex::Construct(const FArguments& InArgs, const TSharedRef<FSlateHyperlinkRun::FWidgetViewModel>& InViewModel)
{
	ViewModel = InViewModel;
	this->HyperDelegate = InArgs._Delegate;
	this->Href = InArgs._Href;
	this->Type = InArgs._Type;
	check (InArgs._Style);
	const FButtonStyle* UnderlineStyle = InArgs._UnderlineStyle != nullptr ? InArgs._UnderlineStyle : &InArgs._Style->UnderlineStyle;
	const FTextBlockStyle* TextStyle = InArgs._TextStyle != nullptr ? InArgs._TextStyle : &InArgs._Style->TextStyle;
	TAttribute<FMargin> Padding = InArgs._Padding.IsSet() ? InArgs._Padding : InArgs._Style->Padding;

	SButton::Construct(
		SButton::FArguments()
		.Text( InArgs._Text )
		.ContentPadding( Padding )
		.ButtonStyle( UnderlineStyle )
		.TextStyle( TextStyle )
		.OnClicked(FOnClicked::CreateRaw(this,&SRichTextHyperlink_Ex::OnClicked))
		.ForegroundColor(FSlateColor::UseForeground())
		.TextShapingMethod( InArgs._TextShapingMethod )
		.TextFlowDirection( InArgs._TextFlowDirection )
	);
}

FReply SRichTextHyperlink_Ex::OnClicked() const
{
	HyperDelegate.ExecuteIfBound(Type, Href);
	return FReply::Handled();
}


  • HyperlinkRichTextBlockDecorator.cpp
// Fill out your copyright notice in the Description page of Project Settings.


#include "Hyperlink/HyperlinkRichTextBlockDecorator.h"

#include "GEventSubsystem.h"
#include "Hyperlink/HyperlinkRichTextDecorator.h"

UHyperlinkRichTextBlockDecorator::UHyperlinkRichTextBlockDecorator(const FObjectInitializer& ObjectInitializer): Super(ObjectInitializer)
{
}

TSharedPtr<ITextDecorator> UHyperlinkRichTextBlockDecorator::CreateDecorator(URichTextBlock* InOwner)
{
	return MakeShareable(new FHyperlinkRichTextDecorator(InOwner, this));
}

const FHyperlinkStyle* UHyperlinkRichTextBlockDecorator::FindHyperlinkStyle(FName TagOrId, bool bWarnIfMissing)
{
	const FRichHyperlinkRow* HlRow = FindHyperlinkRow(TagOrId, bWarnIfMissing);
	if (HlRow)
	{
		return &HlRow->HlStyle;
	}
	
	return nullptr;
}

void UHyperlinkRichTextBlockDecorator::OnClickHyperlink( FString Type,FString Href)
{
	UE_LOG(LogTemp,Display,TEXT("OnClickHyperlink type =  %s  ; href = %s"),*Type,*Href)
	
}

FRichHyperlinkRow* UHyperlinkRichTextBlockDecorator::FindHyperlinkRow(FName TagOrId, bool bWarningIfMissing)
{
	if (HyperlinkSet)
	{
		FString ContextString;
		return HyperlinkSet->FindRow<FRichHyperlinkRow>(TagOrId, ContextString, bWarningIfMissing);
	}

	return nullptr;
}

  • HyperlinkRichTextDecorator.cpp
// Fill out your copyright notice in the Description page of Project Settings.


#include "Hyperlink/HyperlinkRichTextDecorator.h"



FHyperlinkRichTextDecorator::FHyperlinkRichTextDecorator(URichTextBlock* InOwner, UHyperlinkRichTextBlockDecorator* InDecorator)
: FRichTextDecorator(InOwner),Decorator(InDecorator)
{
	HlDelegate.BindUObject(Decorator,&UHyperlinkRichTextBlockDecorator::OnClickHyperlink);
}

bool FHyperlinkRichTextDecorator::Supports(const FTextRunParseResults& RunParseResult, const FString& Text) const
{
	if (RunParseResult.Name == ParseName && RunParseResult.MetaData.Contains(TEXT("id")))
	{
		const FTextRange& IdRange = RunParseResult.MetaData[TEXT("id")];
		const FString TagId = Text.Mid(IdRange.BeginIndex, IdRange.EndIndex - IdRange.BeginIndex);
		const bool bWarnIfMissing = false;
		return Decorator->FindHyperlinkStyle(*TagId, bWarnIfMissing) != nullptr;
	}

	return false;
}

TSharedPtr<SWidget> FHyperlinkRichTextDecorator::CreateDecoratorWidget(const FTextRunInfo& RunInfo,
	const FTextBlockStyle& TextStyle) const
{
	const bool bWarnIfMissing = false;
	const FHyperlinkStyle* HlStyle =  Decorator->FindHyperlinkStyle(*RunInfo.MetaData[TEXT("id")], bWarnIfMissing);
	const FString* Href = RunInfo.MetaData.Find(TEXT("href"));
	const FString* Type = RunInfo.MetaData.Find(TEXT("id"));
	
	const TSharedPtr<FSlateHyperlinkRun::FWidgetViewModel> Model = MakeShareable(new FSlateHyperlinkRun::FWidgetViewModel);
	TSharedPtr<SRichTextHyperlink_Ex> HlWidget = SNew(SRichTextHyperlink_Ex,Model.ToSharedRef())
	.Text(RunInfo.Content)
	.Style(HlStyle)
	.Href(FString(*Href))
	.Type(FString(*Type))
	.Delegate(HlDelegate);

	return HlWidget;
}



  • 然后项目中引用,使用方式与richimg保持一直,创建蓝图时选择hyperlinkDecorator为父类。数据方式为:

      <a id="name" href="content">点击我</>
    

点击ui中的点击我 会打印 onclick的数据 type为name href为 content;

参考连接:
https://docs.unrealengine.com/4.27/en-US/InteractiveExperiences/UMG/UserGuide/UMGRichTextBlock/

https://forums.unrealengine.com/t/umg-richtextblock-hyperlink-href-markup/454860文章来源地址https://www.toymoban.com/news/detail-485245.html

到了这里,关于【UE】富文本块(RichTextBlock) 增加超链接支持的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ChatGPT新增超强插件:文本直接生成视频、海报,支持自定义修改!

    全球著名在线设计平台Canva,在ChatGPT Plus(GPT-4)上推出了插件功能,用户通过文本提示,几秒钟就能生成演示文稿、PPT插图、电子书封面、宴会邀请函等各种精美设计海报,同时支持生成视频。 该插件最强大的功能在于,用户如果对自动生成的海报、视频不满意,可以点击

    2024年02月09日
    浏览(40)
  • 一个支持Sora模型文本生成视频的Web客户端

    大家好,我是 Java陈序员 。 最近 Open AI 又火了一把,其新推出的文本生成视频模型 —— Sora,引起了巨大的关注。 Sora 目前仅仅只是发布预告视频,还未开放出具体的 API. 今天,给大家推荐一个最近十分火热的开源项目,一个支持使用 Sora 模型将文本生成视频的 Web 客户端。

    2024年03月09日
    浏览(55)
  • pytorch-textregression,中文文本回归实践,支持多值输出

    pytorch-textregression是一个以pytorch和transformers为基础,专注于中文文本回归的轻量级自然语言处理工具,支持多值回归等。 数据 使用方式 paper 参考 pytorch-textregression: https://github.com/yongzhuo/Pytorch-NLU/pytorch_textregression 更多样例sample详情见test/tr目录 需要配置好预训练模型目录, 即变

    2024年02月21日
    浏览(40)
  • 前端uni-app自定义精美全端复制文本插件,支持全端文本复制插件 可设置复制按钮颜色

    随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。 通过组件化开发,可以有效实现单独开发,单独维护,而且他们之间可以随

    2024年02月16日
    浏览(44)
  • 【AIGC】2、Visual ChatGPT | 支持图像/文本双输入的对话系统开源啦

    论文:Visual ChatGPT :Talking, Drawing and Editing with Visual Foundation Models 代码:https://github.com/microsoft/visual-chatgpt 出处:Microsoft Research Asia 时间:2023.03 Visual ChatGPT 是一个能够调动多个不同基础视觉模型来理解视觉信息并生成对应回答的系统。 近期, Large Language models(LLMs)发展非常

    2024年02月09日
    浏览(52)
  • c++ word简单的写文本与画表格只支持docx

    简单使用的代码如下所示: #include \\\"stdafx.h\\\" #include windows.h #include \\\"minidocx.hpp\\\" using namespace docx; using namespace std; std::string GB2312ToUTF8(const std::string gb2312) {     int len = MultiByteToWideChar(CP_ACP, 0, gb2312.c_str(), -1, NULL, 0);     wchar_t* wstr = new wchar_t[len + 1];     memset(wstr, 0, len + 1);     M

    2024年02月12日
    浏览(41)
  • Taro支持富文本(微信小程序)图片样式问题及可点击事件

    react提供的dangerouslySetInnerHTML即可 这个属性相比于其他方案的优势在于:1. 支持修改富文本样式  2. Taro官方属性,比插件靠谱 使用这个属性存在两个问题需要解决 1、需要解决图片样式错乱问题 2、图片点击可放大 tips: 正常方式无法绑定事件,样式设置不生效   真机测试没有

    2024年02月10日
    浏览(55)
  • 推荐几个免费的在线文本转语音网站(支持中英文多种语音)

    如果你正在寻找一款免费的在线文本转语音工具,那么你来对地方了!本文将介绍几个完全免费的在线文本转语音网站,推荐收藏下来以备不时之需。 No.1 免费文本转语音(TTSMaker) TTSMaker是第一个推荐的工具,这个网站完全免费,支持30种主流语言和多种语音类型,甚至支持

    2024年02月12日
    浏览(51)
  • 【AIGC】3、Visual ChatGPT | 支持图像/文本双输入的对话系统开源啦

    论文:Visual ChatGPT :Talking, Drawing and Editing with Visual Foundation Models 代码:https://github.com/microsoft/visual-chatgpt 出处:Microsoft Research Asia 时间:2023.03 Visual ChatGPT 是一个能够调动多个不同基础视觉模型来理解视觉信息并生成对应回答的系统。 近期, Large Language models(LLMs)发展非常

    2023年04月15日
    浏览(78)
  • 免费开源的高精度OCR文本提取,支持 100 多种语言、自动文本定位和脚本检测,几行代码即可实现离线使用(附源码)

    免费开源的高精度OCR文本提取,支持 100 多种语言、自动文本定位和脚本检测,几行代码即可实现离线使用(附源码)。 要从图像、照片中提取文本吗?是否刚刚拍了讲义的照片并想将其转换为文本?那么您将需要一个可以通过 OCR(光学字符识别)识别文本的应用程序。 图

    2024年02月01日
    浏览(122)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包