UI之间不能沟通数据

[复制链接]
查看2844 | 回复3 | 2017-11-9 19:57:51 | 显示全部楼层 |阅读模式
我创建了两个C++的UserWidget类,一个作为背包,一个作为背包中的物品,我把两个C++类拓展成蓝图,然后在生成子蓝图,在这个子蓝图中画UI,在C++的类中写代码,这个时候背包想获取物品被单击了几次,我获取到了UI中的button,然后定义了一个整型变量用来计数,但是我不知道怎么把这个值传到另一个类中,我用UMy_UserWidget().aa  这样的方式传过去,生成不出错,编译不出错,但是执行到这个命令就UE4就奔溃,确定每个定义都是public:定义的,到底是因为什么,望大佬们解答。。。。。 QQ截图20171109195630.png
Ecivon | 2017-11-9 20:43:40 | 显示全部楼层
首先,你在背包类代码中应该是有物品widget的引用的,它才是你取值的入口。而不是如图里的类名后直接访问成员,你这个代码确实在语法上没有太大错误,所以能编译。但是每次循环时是它将调用一个USmall_UserWidget的构造函数生成一个局部实例。而UObject是不可以直接使用构造函数来创建实例的,需要使用NewObject的模板函数。所以你这里就崩溃了。

从上面代码可以看出,你的C++基础过于薄弱,请略读《C++ Primer》后继续学习把。
回复 支持 反对

使用道具 举报

恭喜发财 | 2017-11-12 10:50:26 | 显示全部楼层
Ecivon 发表于 2017-11-9 20:43
首先,你在背包类代码中应该是有物品widget的引用的,它才是你取值的入口。而不是如图里的类名后直接访问成 ...

谢谢您的建议和解答,书已经在买了,我底子确实不太好,都是自己学,很多都是一带而过,可是我还有个问题希望您能帮我解答,我这个项目想做成商店的样子,应该以什么样的思路去做,在UI中创建出了子控件,单击事件也写了,可是我怎么办才能在商店中单击的信息传到背包中,我在单击事件中打算单击的时候在背包中创建一个子控件,但是发现创建没法执行,因为用的所有指针什么的都是初始值,我想重新给他指向背背包中的可以创建子控件的容器,当执行到这里的时候还是和以前一样UE4奔溃,不好意思我说了这么多,我希望您能听懂我想表达的,再次感谢
回复 支持 反对

使用道具 举报

Ecivon | 2017-11-15 10:04:55 | 显示全部楼层
不是太能理解你的描述,感觉你的叙述能力很成问题。不过总的来说,UE4 Slate的UI间交互是通过Delegate来实现的:比如子父控件间,那么首先需要子控件有一个Delegate(可以自定义参数列表,从而达到传递信息的目的)暴露出来,然后父控件需要有一个相应的事件处理函数。子控件的Delegate供父控件进行Handler的绑定,这样在在进行交互时,子控件就可以通过Delegate调用到父控件的Handler从而达到交互的目的。当然本质上讲,你不使用UE4 Delegate这套规则也行,可以使用函数指针,以及更高级点的C++11的std::function等特性。举个使用Delegate的例子:父容器创建中多个按钮,在按钮点击时告诉父控件第几个按钮被点击了。首先分析问题,用户操作的入口时按钮被点击,此时响应的时按钮的OnClicked Delegate的Handler,我们需要通过着Handler来告诉父容器控件自身被点击。从此问题描述中知道这里所描述的信息是子控件的序号,另外注意到OnClicked这个Handler的Signature是一个不含参数的函数,因此我们无法直接通过此函数来传递序号。解决方案是,扩展SButton类,添加描述自身序号的成员,自定带序号参数的Signature的Delegate并创建相应成员,还要创建OnClicked相应的Handler函数,并在其中检测并执行我们自定的Delegate成员,其中把序号成员变量作为参数传入。在父控件创建子控件的时候,赋值子控件序号,并将父控件处理子控件点击事件的Handler绑定在我们自定的子控件的Delegate成员上。这样子,在子控件OnClicked事件触发时,就会在父控件的Handler中得知哪个子控件按钮被点击了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

6

主题

18

回帖

24

积分

初阶编码师

积分
24