5

質問

double 型のハンドルのイベントとプロパティのリストを , として取得するにはどうすればよいfigureですaxesか?

問題

Matlab のドキュメントでは、インターフェイスで何が起こってもリッスンするために 、 などWindowButtonDownFcnを使用するように指示されています。WindowButtonMotionFcn問題は、このプロパティが次の事実として非常に制限されていることです。

変数をスコープ内に保つ

MATLAB が関数ハンドルを評価するとき、関数ハンドルが作成されたときと同じ変数がスコープ内にあります。(対照的に、文字列として指定されたコールバックは、ベース ワークスペースで評価されます。)これにより、オブジェクト ハンドルなどのグローバル データを GUI で管理するプロセスが簡素化されます。

はい、ButtonDownFcn からコールバックを再定義、追加、または削除する必要がない場合、これは完璧です。これを行うと、新しいスコープでそれらを宣言しているため、他の関数ハンドル変数スコープが失われるためです。必要な変数が含まれていない可能性があります。

したがって、1 つの方法は、イベントがアクティブ化されたときに呼び出されるプロパティではなく、イベント自体をリッスンすることです。そうすることで、わざわざ ButtonDownFcn を再宣言したり、変数をスコープに保持したりする必要がなくなります。他のソリューションは実装が非常に遅いです。. handle.listenerまたはaddlistenermatlab リスニング ツールを使用するように、イベントを直接リッスンできれば、それを気にする必要はありません。

すでに知られている 1 つの優れたアプローチ

最善の解決策の 1 つは、この FEXであり、これは弱い matlabWindowButtonDownFcnと、WindowButtonDownFcn「リスナー」関数 matlab が持つすべてのプロパティを強化するため、グラフィカル インターフェイスで変更をリッスンする任意の量の関数を使用できます。他の関数ハンドルはスコープ変数を失います。

これにより、すべてがラップされるため、matlab イベントを取得する必要はありません。しかし、matlab がユーザーに、より良いアプローチを文書化する代わりに壊れた機能を使用するように導き、人々が物事を本来あるべきように使用できるようにすべてをラップするように導くことは、私を楽しませてくれます。


役に立つかもしれない情報。

meta.classクラスが持つすべてのプロパティ、イベントなどを提供するについて知っています。私が持っている1つのクラスの場合、それは 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 のメタクラスを取得figureできれば (それが可能であれば)、Eventsmatlab で利用できる場合は実装されたものにアクセスできるということです。

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) は、ユーザーに公開される通常のスタイルの OOPではなく、文書化されていないUDDメカニズムを使用して実装されています。classdef

そのため、システムを直接使用して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

get を使用してみてください:

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

問題は、値が保存されていない場合の取得方法lsnrだと思います。gca

方法が見つかりません。

于 2013-08-23T00:16:21.570 に答える