UWidget封装SWidgetUMG

2015年8月30日0

为了使用UMG中的一些高级或便利特性,需要将制作好的Slate控件封装UWidget中去。

当前UE4版本4.8.3。

将Slate封装UMG中去有很多的好处,因为在代码中对需要重用的控件进行不断的重新布局是一件非常繁琐的事情。同时,UMG也有在3D空间中进行显示这样的高级功能。

由于UMG本身就是对Slate的封装,所以这个过程可以参照UE4的源代码进行研究。

这里所做的是尝试对上一回所做的文件目录树进行封装

直接上代码

CListViewWidget.h

 
 
 
 
 
 

C++

 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#pragma once
 
#include "CListViewWidget.generated.h"
 
 
UCLASS()
class TEST_MP_API UCListViewWidget : public UWidget
{
    GENERATED_UCLASS_BODY()
 
public:
 
#if WITH_EDITOR
    // UWidget interface
    virtual const FSlateBrush* GetEditorIcon() override;
    virtual const FText GetPaletteCategory() override;
    virtual void OnCreationFromPalette() override;
    // End UWidget interface
#endif
 
protected:
    // UWidget interface
    virtual TSharedRef<SWidget> RebuildWidget() override;
    virtual void OnBindingChanged(const FName& Property) override;
    // End of UWidget interface
 
protected:
    TSharedPtr<class SDDFileTree> MyFileTree;
};

封装类直接继承自UWidget即可,剩下的就是对UWidget中的函数进行实现。

CListViewWidget.cpp

 
 
 
 
 
 

C++

 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// Fill out your copyright notice in the Description page of Project Settings.
 
#include "Test_mp.h"
#include "SDDFileTree.h"
#include "CListViewWidget.h"
 
 
/** GENERATED_UCLASS_BODY() */
UCListViewWidget::UCListViewWidget(const FObjectInitializer& ObjectInitializer)
    : Super(ObjectInitializer)
{
    bIsVariable = false;
}
 
/** <编辑器属性 */
#if WITH_EDITOR
 
// <图标
const FSlateBrush* UCListViewWidget::GetEditorIcon()
{
    return FUMGStyle::Get().GetBrush("Widget.TextBlock");
}
 
// <分类目录
const FText UCListViewWidget::GetPaletteCategory()
{
    return NSLOCTEXT("Testmp", "Custom", "Ch_Custom");
}
 
// <创建时的默认值
void UCListViewWidget::OnCreationFromPalette()
{
    ;
}
 
#endif
 
TSharedRef<SWidget> UCListViewWidget::RebuildWidget()
{
    MyFileTree = SNew(SDDFileTree).OwnerHUD(nullptr);
 
    return MyFileTree.ToSharedRef();
}
 
void UCListViewWidget::OnBindingChanged(const FName& Property)
{
    Super::OnBindingChanged(Property);
 
    if (MyFileTree.IsValid())
    {
        ;
    }
}

在所有的函数中,RebuildWidget()是最重要的。

参看UWidget的源代码可以发现,所有对被封装SWidget的引用都是通过这个函数获得的,因此在这里面写上SWidget对应的构造生成就可以了。

OnBindingChanged函数是用于属性代理通知的,这里是简单的封装,没有提供属性代理,因此直接return也是可以的。

在WITH_EDITOR宏中的是编辑器属性,用于封装后的UWidget在蓝图编辑器中显示。具体每一个函数的含义已经在注释中了。

将上面的代码编译通过之后,就可以在UMG的编辑器中看到我们添加的控件了:

将CListViewWidget拖动控件蓝图上,并在HUD中展示此控件蓝图,就能在项目中与其他UMG控件一样使用了:

这样以来Slate的使用就会变得方便很多。

大神的Blog挂了,从Bing快照里复制过来的备份的更多相关文章

  1. Android开发相关的Blog推荐——跟随大神的脚步才能成长为大神

    转载:https://blog.csdn.net/zhaokaiqiang1992/article/details/43731967 CSDN 鸿洋:http://blog.csdn.net/lmj6 ...

  2. [转帖] select、poll、epoll之间的区别总结[整理] + 知乎大神解答 https://blog.csdn.net/qq546770908/article/details/53082870 不过图都裂了.

    select.poll.epoll之间的区别总结[整理] + 知乎大神解答 2016年11月08日 15:37:15 阅读数:2569 http://www.cnblogs.com/Anker/p/3 ...

  3. 【推荐】Java工程师如何从普通成为大神值得一读

    本文源自 http://www.hollischuang.com/archives/489 一点感悟 java作为一门编程语言,在各类编程语言中作为弄潮儿始终排在前三的位置,这充分肯定了java语言的 ...

  4. Android 大神博客汇集

    非常给力的CSDNBlog和个人Blog,这些Blog都有一个共同的特点,即内容详实,讲解透彻,也算是给后来的初学者指一条路吧!只要你下定决心跟随强者的脚步,成为人们眼中的大神,只不过是时间问题! 下 ...

  5. 推荐几个Dynamic Crm的大神博客

    ghostbear的博客:http://blog.csdn.net/ghostbear/article/category/1072859 ghostbear大神的博客是新手学习Dynamics Crm ...

  6. python目标定位(借鉴csdn上大神)

    写博客是为了记录下来,毕竟好多东西记不住,看过就忘了,收藏又太多,还不如搬运到自己博客下面,随时可翻~~~ 近期再学目标识别与定位,看着原理都很简单,但是真自己做,又觉得困难重重. csdn上一个大神 ...

  7. 大神们都在用的两个国外的免费离线下载:Rain&amp; LoadBT

    大神们都在用的两个国外的免费离线下载:Rain& LoadBT 最近QQ离线和迅雷离线也都挂了,115还死贵,所以分享两个国外免费的网站.希望可以为大家提供一些帮助,同时也借此机会同大家相互交 ...

  8. [ZZ] 麻省理工( MIT)大神解说数学体系

    麻省理工( MIT)大神解说数学体系 http://blog.sina.com.cn/s/blog_5ff4fb7b0102e3p6.html 其实每一门学科都应该在学习完成后,在脑子里面有一个体系, ...

  9. 搞IT,算法编程不错的学习网址 & 一些专栏博客大神的地址(汇总)

    博客专栏大神 王晓华(算法的乐趣) 算法系列:http://blog.csdn.net/orbit/article/category/830251 PostgreSQL深入理解内核系列:http:// ...

随机推荐

  1. 常用linux 命令 -网络相关

    此文参考: 1.网络文章,但最后发现源头是在<鸟哥私房菜>,再次感谢原作者: 2.工作中跟同事讨论,自己尝试. 本人水平有限,如有错误,请大家指正,谢谢. 一 网络参数设置命令 1.ifc ...

  2. 监视 Windows 剪切板

    一.先看代码 import win32con,win32gui import win32clipboard as cb class MyWindow(): def __init__(self): #注 ...

  3. Netty 实现 WebSocket 聊天功能

    上一次我们用Netty快速实现了一个 Java 聊天程序(见http://www.waylau.com/netty-chat/).现在,我们要做下修改,加入 WebSocket 的支持,使它可以在浏览 ...

  4. nmq消息队列解析

    消息中间件NMQ 1.What is nmq? nmq = new message queue; 一个通用消息队列系统 为在线服务设计 什么是消息队列?问什么需要?有哪些功能? 消息队列的本质:1.多 ...

  5. IOS中div contenteditable=true无法输入

    在IOS中<div contenteditable="true"></div>中点击时可以弹出键盘但是无法输入.加一个样式-webkit-user-sele ...

  6. Spring Boot 乐观锁加锁失败 - 使用AOP恢复错误

    之前写了一些辅助工作相关的Spring Boot怎么使用AOP.这里继续正题,怎么减少Spring Boot 乐观锁加锁报错的情况(基本可以解决). 1. 包依赖 spring-boot-starte ...

  7. 菜鸟笔记:java变量命名及峰驼式命名法

    如同酒店会给每个房间起个性化的名字一样,程序中的变量也需要用合理的名字进行管理---变量名! 需要注意,给酒店房间起名字时可以是数字,如"802",也可以是有趣的名字,如" ...

  8. [转载]jquery版小型婚礼(可动态添加祝福语)

    原文链接:http://www.cnblogs.com/tattoo/p/3788019.html 前两天在网上不小心看到“js许愿墙”这几个字,我的神经就全部被调动了.然后就开始我 的百度生涯,一直 ...

  9. c++虚析构函数

    虚析构函数的作用主要是当通过基类指针删除派生类对象时,调用派生类的析构函数(如果没有将不会调用派生类析构函数) #include <iostream> using namespace st ...

  10. python之路十四

    概述 HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的一套规则,大家都来遵守他,这样就可以让浏览器 ...