5

问题

如何获取 double 类型句柄的事件和属性列表,如figure, axes

问题

Matlab 文档告诉您使用WindowButtonDownFcn,WindowButtonMotionFcn等来收听界面上发生的任何事情。问题是这个属性非常有限,因为以下事实

将变量保持在范围内

当 MATLAB 计算函数句柄时,与创建函数句柄时相同的变量在范围内。(相比之下,指定为字符串的回调在基本工作区中进行评估。)这简化了在 GUI 中管理全局数据(例如对象句柄)的过程。

是的,这是完美的,如果您不必从 ButtonDownFcn 重新定义、添加或删除回调,因为如果这样做,您将失去其他函数句柄变量范围,因为您在新范围内声明它们may肯定不会包含您如此需要的变量。

因此,一种方法是监听事件本身,而不是在事件激活时调用的属性,这样做,您不必费心重新声明 ButtonDownFcn 以及如何将变量保持在范围内,因为其他解决方案实施起来很慢!. 如果我可以像使用 matlab 监听工具那样直接监听事件handle.listeneraddlistener我就不必为此烦恼了。

一种已知的好方法

似乎最好的解决方案之一是这个 FEX,它赋予了弱 matlabWindowButtonDownFcnWindowButtonDownFcnmatlab 具有的任何属性“监听器”功能,这样您就可以在图形界面上拥有任意数量的函数来监听变化,而不必关心您的其他函数句柄将丢失其范围变量。

有了这个,我不需要获取 matlab 事件,因为它为我包装了所有内容。但是,matlab 引导您的用户使用损坏的功能而不是记录更好的方法并引导人们将所有内容包装起来,以便他们可以按应有的方式使用东西,这仍然让我感到有趣。


可能有用的信息。

我知道meta.class这会给我一个类所具有的所有属性、事件等。对于我有一个继承自 a 的类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]

使用该元数据,我可以从我的Event班级中获取 EventList,它们是:

>> EventMeta.EventList.Name

ans =

attemptToClick


ans =

ObjectBeingDestroyed

好吧,在这种情况下,这并不是一件好事,因为我已经实现了它并且我知道它所具有的事件,因为我有源代码。问题是,如果我可以获得 a 的元类(如果可能的话),如果它们在 matlab 上可用figure,我就可以访问它的实现。Events

4

4 回答 4

2

当我改进我的问题时,我设法找到了答案(不幸的是,我之前似乎没有在搜索中看到它们,更糟糕的是,我之前打开的一些链接......)

此处未记录的matlab 博客展示了如何从 matlab 句柄对象中获取句柄。似乎已经在 2011 年就这个问题在 stackoverflow 中提出了一个关于此问题的问题,并由@gnovice 正确回答。答案是:

>> get(get(classhandle(handle(gcf)),'Events'),'Name')
ans = 
    'SerializeEvent'
    'FigureUpdateEvent'
    'ResizeEvent'
    'WindowKeyReleaseEvent'
    'WindowKeyPressEvent'
    'WindowButtonUpEvent'
    'WindowButtonDownEvent'
    'WindowButtonMotionEvent'
    'WindowPostChangeEvent'
    'WindowPreChangeEvent'

我仍然想提请您注意FEX,它是另一个很好的解决方案,它可以为您提供更好的使用 matlab 提供的图形组件的可能性。

使用示例:

>> k=handle.listener(gcf,'WindowButtonMotionEvent','disp(''MOVEMENT DETECTED!!'')');   
>> MOVEMENT DETECTED!! % When you move the mouse on the figure
>> MOVEMENT DETECTED!!
>> MOVEMENT DETECTED!!
>> MOVEMENT DETECTED!!
>> MOVEMENT DETECTED!!
>> MOVEMENT DETECTED!!
>> delete(k)
于 2013-08-23T03:07:58.580 回答
2

在幕后,Handle Graphics (HG) 是使用未记录的UDDclassdef机制实现的,而不是向用户公开的通常样式的 OOP。

这就是为什么您不能直接使用meta.class系统来获取有关此类句柄的元信息。

正如您已经在Yair Altman 的博客中发现的那样,有一些未记录的方式来监听事件:

fig = hg.figure(); plot(rand(100,1))
lh = handle.listener(fig, 'WindowButtonDownEvent',@(~,~)disp('clicked'));

如果您已经有一个现有的 HG 对象句柄(用数字句柄表示),请使用handle将其转换为 UDD 句柄:

f = figure();
fig = handle(f);

是的,我知道,这个术语handle在 MATLAB 中非常重载,可能指代很多东西

于 2013-08-24T13:45:51.270 回答
1

尝试使用获取:

fig = gcf();
get(fig)
于 2013-08-22T19:40:30.057 回答
1

我不知道该怎么做。我可以提供一些示例代码来演示我认为被问到的内容。这是一个相对较新(因此未使用)的 Matlab 功能:

hh = handle(gca);
lsnr = addlistener(hh,'XLim','PreGet',@(~,~)disp('<<<Getting XLIM values>>>'))

观察听者的行动

>> get(hh,'XLim')
<<<Getting XLIM values>>>
ans =
     0     1

我认为问题是如果没有存储该值如何获取lsnrgca

我找不到办法。

于 2013-08-23T00:16:21.570 回答