Wer*_*ner 5 reflection matlab user-interface handle event-handling
我怎么可能会得到double类型的处理事件和属性的列表,如一个figure,axes?
Matlab文档告诉您使用WindowButtonDownFcn,WindowButtonMotionFcn等等,以便听取您界面上发生的任何事情.问题是这个属性非常有限,如下所示:
保持变量范围
当MATLAB评估函数句柄时,相同的变量在范围内,就像创建函数句柄时一样.(相反,在基本工作空间中评估指定为字符串的回调.)这简化了在GUI中管理全局数据(如对象句柄)的过程.
是的,如果您不必从ButtonDownFcn重新定义,添加或删除回调,这是完美的,因为如果这样做,您将失去其他函数处理变量范围,因为您在新范围内声明它们可能肯定不会包含你需要的变量.
因此,一种方法是监听事件本身,而不是事件被激活时调用的属性,这样,您就不必费心重新调用ButtonDownFcn以及如何将变量保持在范围内,因为其他解决方案实施起来很慢!.如果我可以直接听取事件,就像我使用handle.listener或使用addlistenermatlab监听工具那样,我就不必为此烦恼了.
其中它似乎是最好的解决方案是这一FEX,其授权弱MATLAB WindowButtonDownFcn,WindowButtonDownFcn和任何属性"监听"功能的MATLAB了,这样就可以有都听你的图形界面改变功能的任何金额,而不必关心,如果您其他函数句柄将丢失其范围变量.
有了这个,我不需要得到matlab事件,因为它包装了我的一切.但仍然让我感到高兴的是,matlab引导用户使用破碎的功能,而不是记录更好的方法,并引导人们将所有东西包裹起来,以便他们可以按照应有的方式使用.
我知道meta.class这将给我一个班级所有的属性,事件等.对于一个继承自以下的类handle:
>> EventMeta = ?Event
EventMeta =
class with properties:
Name: 'Event'
Description: ''
DetailedDescription: ''
Hidden: 0
Sealed: 0
Abstract: 0
ConstructOnLoad: 0
HandleCompatible: 1
InferiorClasses: {0x1 cell}
ContainingPackage: []
PropertyList: [64x1 meta.property]
MethodList: [29x1 meta.method]
EventList: [2x1 meta.event]
EnumerationMemberList: [0x1 meta.EnumeratedValue]
SuperclassList: [1x1 meta.class]
Run Code Online (Sandbox Code Playgroud)
使用该元数据我可以从我的Event类中获取EventList ,它们是:
>> EventMeta.EventList.Name
ans =
attemptToClick
ans =
ObjectBeingDestroyed
Run Code Online (Sandbox Code Playgroud)
嗯,在这种情况下,这不是一件好事,因为我已经实现了它,因为我有源,所以我知道它有的事件.问题是,如果我能得到a的元类figure(如果可能的话),我可以访问它的实现,Events如果它们在matlab上可用的话.
在幕后,Handle Graphics (HG) 是使用未记录的UDD机制实现的,而不是classdef向用户公开的通常风格的 OOP。
这就是为什么你不能直接使用meta.class系统来获取此类句柄的元信息。
正如您已经在Yair Altman 的博客上发现的,有一些未记录的监听事件的方法:
fig = hg.figure(); plot(rand(100,1))
lh = handle.listener(fig, 'WindowButtonDownEvent',@(~,~)disp('clicked'));
Run Code Online (Sandbox Code Playgroud)
如果您已有 HG 对象句柄(用数字句柄表示),请使用handle将其转换为 UDD 句柄:
f = figure();
fig = handle(f);
Run Code Online (Sandbox Code Playgroud)
是的,我知道,这个术语handle在 MATLAB 中的含义非常多,可能指代很多东西
| 归档时间: |
|
| 查看次数: |
1563 次 |
| 最近记录: |