让Matlab处理事件或属性

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上可用的话.

Amr*_*mro 2

在幕后,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 中的含义非常多,可能指代很多东西