1

我创建了一个类管理的 GUI,其中定义了以下方法

function h = make_figure(this)
    h = figure('CloseRequestFcn',@this.close_figure);
    this.openFigures(end+1) = h;
end

function close_figure(this, src, event)
    this.openFigures(this.openFigures == src) = [];
    delete(src);
end

在 GUI 的整个生命周期中,借助上述方法可以创建和关闭图形。现在奇怪的部分...

如果我在 MATLAB 的“当前文件夹”窗口中双击一个图形文件,例如(myfigure.fig),然后尝试关闭它(当 GUI 仍然存在时)close_figure,那么 GUI 类的方法会运行,尽管它不是用 of 创建h = figure('CloseRequestFcn',@this.close_figure);make_figure方法!!!这是第一个奇怪的部分。第二个奇怪的部分是,尽管执行了代码的无意部分,但它不应该产生问题,因为命令this.openFigures(this.openFigures == src) = [];实际上this.openFigures保持不变,实际上close_figure所做的一切delete(src)都是可取的。尽管有上述情况,但我的程序在上述情况发生后表现......很奇怪。

我注意到,如果我figure在命令窗口中点击然后关闭它,一切正常,该close_figure方法不会执行。只有在打开由 GUI 类创建的 .fig 文件时,才会出现问题。

有任何想法吗?

4

2 回答 2

0

我只是想指出,这里有一个其他人可能面临的相关问题。您不应该通过双击 gui.fig 文件来打开您的 GUI。这不是所需的行为,因为您的打开函数将永远不会被调用。如果您在其中有我们许多人所做的代码,它将不会执行,另一个副作用是也不会正确设置句柄变量。

您应该先在 GUIDE 中打开它然后单击运行,或者直接运行 gui.m 文件。这将产生所需的结果,并且 gui 将按预期运行。

于 2014-01-15T10:05:19.750 回答
0

我刚刚尝试了您描述的场景,并没有看到任何奇怪的行为;创建该类的实例,使用它制作图形,然后从“当前文件夹”文件浏览器中打开一个图形文件,然后将其关闭。

这是我使用的类定义:

classdef MyFigureClass < handle
    properties
        openFigures = [];
    end

    methods
        function h = make_figure(obj)
            h = figure('CloseRequestFcn',@(src,evt) close_figure(obj,src,evt));
            obj.openFigures(end+1) = h;
        end

        function close_figure(obj, src, evt)
            obj.openFigures(obj.openFigures == src) = [];
            delete(src);
        end

    end
end

(在 Windows XP 32 位的 R2012a 中测试。)


编辑

好的,我想我知道问题出在哪里。这是重现的步骤。首先将以下方法添加到上面的类中:

function save_figure(obj, idx)
    saveas(obj.openFigures(idx), sprintf('fig%02d.fig',idx))
end

现在使用我们的类包装器,让我们创建一个图形,并将其保存到图形文件中:

f = MyFigureClass();
f.make_figure()
f.save_figure(1)       %# creates fig01.fig

接下来清除您的工作区clear all,并将类定义文件移动MyFigureClass.m到其他文件夹(不在路径上的文件夹)。现在尝试加载保存的图形hgload fig01.fig,它会抛出错误:

Warning: Cannot load an object of class 'MyFigureClass':
Its class cannot be found. 
> In C:\Program Files\MATLAB\R2012a\toolbox\matlab\graphics\hgload.p>localLoadFile at 167
  In C:\Program Files\MATLAB\R2012a\toolbox\matlab\graphics\hgload.p>hgload at 59
  In openfig at 72
  In open at 159
  In uiopen at 196 

您必须发出以下命令才能强制关闭它:

close all force

编辑2

一种解决方案(如评论中所述)是在保存之前重置图形关闭回调函数。这是我如何修改save_figure上面的函数:

function save_figure(obj, idx)
    %# backup callback function
    fcn = get(obj.openFigures(idx),'CloseRequestFcn');

    %# set default callback function
    set(obj.openFigures(idx),'CloseRequestFcn','closereq')

    %# save figure
    saveas(obj.openFigures(idx), sprintf('fig%02d.fig',idx))

    %# restore callback function
    set(obj.openFigures(idx),'CloseRequestFcn',fcn)
end
于 2012-06-02T21:55:36.827 回答