gpt4 book ai didi

matlab - 获取 Matlab 处理事件或属性

转载 作者:太空宇宙 更新时间:2023-11-03 19:42:46 25 4
gpt4 key购买 nike

问题

如何获取 double 型句柄的事件和属性列表,如图形

问题

Matlab 文档告诉您使用 WindowButtonDownFcnWindowButtonMotionFcn 等来收听界面上发生的任何事情。问题是此属性非常有限,如 the following fact :

将变量保持在范围内

When MATLAB evaluates function handles, the same variables are in scope as when the function handle was created. (In contrast, callbacks specified as strings are evaluated in the base workspace.) This simplifies the process of managing global data, such as object handles, in a GUI.

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

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

一种已知的好方法

最好的解决方案之一似乎是 this FEX ,它赋予弱 matlab WindowButtonDownFcnWindowButtonDownFcn 以及 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]

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

>> EventMeta.EventList.Name

ans =

attemptToClick


ans =

ObjectBeingDestroyed

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

最佳答案

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

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

正如您已经在 Yair Altman's blog 上发现的那样, 有未记录的方法来监听事件:

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

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

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

是的,我知道,handle 一词在 MATLAB 中使用过多,可能指代很多东西

关于matlab - 获取 Matlab 处理事件或属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18389240/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com