Как объявить наследование объектов uicontrol в MATLAB - PullRequest
0 голосов
/ 14 февраля 2020

Я изучаю, как программно создать приложение в MATLAB с графическим интерфейсом пользователя. Я использую MATLAB 2015a.

Я не понимаю, почему я получаю эту ошибку:

Error using GuiTitle
The specified superclass 'uicontrol' contains a parse error, cannot be found on MATLAB's search path, or
is shadowed by another file with the same name.

Я пытаюсь создать класс с именем GuiTitle, в котором в качестве суперкласса используется uicontrol. , Мой класс GuiTitle выглядит так:

classdef GuiTitle < uicontrol
    methods
        function obj = GuiTitle(text)
            if nargin == 0
                text = '';
            end

            obj@uicontrol('Style', 'text', 'String', upper(text));
        end
    end   
end

Вот мой код:

function hello_gui
% Test GUI

GuiConstants % contains constants that 
GuiTitle %%

f = figure('Visible','off','Position',[POS_FROM_LEFT,POS_FROM_BOTTOM,...
                                       WINDOW_WIDTH,WINDOW_HEIGHT]);
set(f, 'MenuBar', 'none')

titleText    = 'process variable names';

%title = uicontrol('Style', 'text', 'String', upper(titleText));

title        = GuiTitle(titleText) %%

title.Position = [0, 0, WINDOW_WIDTH, WINDOW_HEIGHT];
title.FontSize = FONT_SIZE;

f.Visible = 'on';

end

Когда я закомментирую строки с %% и раскомментирую

title = uicontrol('Style', 'text', 'String', upper(titleText));

окно отображается правильно:

correct output

Чего мне не хватает?

1 Ответ

0 голосов
/ 14 февраля 2020

uicontrol - это функция, которая создает объект типа matlab.ui.control.UIControl:

h = uicontrol;
class(h)    % returns 'matlab.ui.control.UIControl'

Однако этот класс запечатан и не может использоваться в качестве суперкласса:

classdef myclass < matlab.ui.control.UIControl
   ...
>> a=myclass
Error using myclass
Class 'matlab.ui.control.UIControl' is Sealed and may not be used as a superclass.

Обратите внимание, что GUI в MATLAB разработаны совсем не так, как вы могли бы использовать на других языках. Нет необходимости наследовать классы пользовательского интерфейса для изменения их поведения, вы определяете их поведение, устанавливая функции обратного вызова:

h = uicontrol;
h.String = 'button';
h.Callback = @(src,event) msgbox('pressed the button!');
...