【问题标题】:Matlab GUI: referencing an existing object handle using a variableMatlab GUI:使用变量引用现有对象句柄
【发布时间】:2012-05-05 12:39:10
【问题描述】:

我目前正在为学校做 matlab 期末项目。我认为自己在编程方面知识渊博且精通。但 Matlab 实在是太奇怪了。

基本问题 (找到答案后才意识到)! 如何在调用 gui 句柄对象时使用变量 没有使用变量的名称而不是值?

换句话说: 在字段名中使用变量(如果我知道它这么简单,我就不会问了)

我的项目正在构建一个古老的“战舰”游戏的简单再现。

我的问题:我目前有 5 个物体(斧头)用于船舶碎片。一次选择一个以将它们移动到另一个位置(网格)。 我可以按钮点击后使用setpixelposition来移动每个对象。

现在在按钮点击下,我有这样的东西

function btnPlaceShip_Callback(hObject, eventdata, handles) 

    %Store the current selected ship(passed from an onclick to a label) 
    ship = get(handles.lblSelectedShip,'string');

    %I have tried everything I could think of, but basically I want to achieve the
    %following

    setpixelposition(handles.ship, [0 250 50 250]) 
    %where the variable 'ship' contains the name of the object.

换句话说,var ship = 'shipAircraftCarrier',并且..

    setpixelposition(handles.shipAircraftCarrier, [0 250 50 250]) 

工作!(设置指定的特定船的位置)。但是,使用变量 ship,matlab 会按字面意思而不是按其值来获取字符串。改用变量会非常方便!

如果有人有任何解决方案,我将不胜感激。我已经在网上搜索过,但也许我对 Matlab GUI 的东西缺乏一些基本的了解 - matlab 帮助文档非常不具描述性,并没有太大帮助。

【问题讨论】:

    标签: matlab matlab-guide


    【解决方案1】:

    正如其他人所说,使用dynamic fieldnames。虽然没有代码来测试它,但我相信只需在 ship 周围加上括号即可将字符串替换为结构名称,因此

    setpixelposition(handles.(ship), [0 250 50 250])
    

    尽可能避免使用 eval()。

    【讨论】:

    • 谢谢。我很快就会试试这个。在我看到这个答案之前,我整天都在尝试各种事情!但我学到了很多——我终于明白 matlab 是如何组织所有这些 gui 的东西了!我认为一切都很混乱,因为我不理解自动生成的代码并且花了一段时间才掌握它(即我现在意识到“句柄”只是一个结构数组!)
    【解决方案2】:

    您可以使用eval 函数执行此操作,但您需要小心字符串注入:

    setpixelposition(eval(strcat('handles.',ship)), [0 250 50 250])  
    

    【讨论】:

    • 感谢您的回答。我会尝试这个,但其他用户提到我可以将变量放在括号中,例如:setpixelposition(handles.(ship), position) 更短。我不认为我需要担心我的 matlab 脚本中的字符串注入,特别是因为这个变量不是通过输入框输入的,而是通过 gui 选择
    【解决方案3】:

    您可以使用dynamic fieldnamesgetfield。在 Matlab structs 和 Javascript objects 中使用标识符与字符串进行字段索引非常相似。

    Matlab:

    fromId = handles.shipAircraftCarrier; %identifier
    fromString = handles.('shipAircraftCarrier'); %string
    

    Javascript:

    var fromId = handles.shipAircraftCarrier; //identifier
    var fromString = handles["shipAircraftCarrier"]; //string
    

    【讨论】:

    • 谢谢!变量 shipTag 是一个字符串变量,等于船的标签。我将尝试使用:handles.(shipTag) 而不是handles.shipTag
    猜你喜欢
    • 1970-01-01
    • 2011-10-28
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    相关资源
    最近更新 更多