Я работаю над довольно сложной графической программой для развертывания с помощью MATLAB Compiler. (Есть веские причины, по которым MATLAB используется для создания этого графического интерфейса, и это не относится к этому вопросу. Я понимаю, что создание GUI не очень подходит для этого языка.)
Существует множество способов обмена данными между функциями в графическом интерфейсе или даже передача данных между графическими интерфейсами в приложении:
-
setappdata/getappdata/_____appdata
- связывать произвольные данные с дескриптором -
guidata
- обычно используется с GUIDE; "сохранить [s] или загрузить [s] данные GUI" в структуру дескрипторов - Применить операцию
set/get
к свойствуUserData
объекта handle - Использовать вложенные функции в пределах основной функции; в основном эмулирует переменные области видимости "глобально".
- Передавать данные взад и вперед среди подфункций
Структура моего кода не самая красивая. Прямо сейчас у меня есть двигатель, отделенный от front-end (хорошо!), Но код GUI довольно похож на спагетти. Вот скелет "активности", чтобы занять Android-говоря:
function myGui
fig = figure(...);
% h is a struct that contains handles to all the ui objects to be instantiated. My convention is to have the first field be the uicontrol type I'm instantiating. See draw_gui nested function
h = struct([]);
draw_gui;
set_callbacks; % Basically a bunch of set(h.(...), 'Callback', @(src, event) callback) calls would occur here
%% DRAW FUNCTIONS
function draw_gui
h.Panel.Panel1 = uipanel(...
'Parent', fig, ...
...);
h.Panel.Panel2 = uipanel(...
'Parent', fig, ...
...);
draw_panel1;
draw_panel2;
function draw_panel1
h.Edit.Panel1.thing1 = uicontrol('Parent', h.Panel.Panel1, ...);
end
function draw_panel2
h.Edit.Panel2.thing1 = uicontrol('Parent', h.Panel.Panel2, ...);
end
end
%% CALLBACK FUNCTIONS
% Setting/getting application data is done by set/getappdata(fig, 'Foo').
end
У меня есть ранее написанный код, в котором ничего не вложен, поэтому я все время пропускал h
туда и обратно (так как нужно было перерисовать, обновлять и т.д.) и setappdata(fig)
для хранения фактических данных. В любом случае, я сохраняю одно "действие" в одном файле, и я уверен, что это будет кошмар для обслуживания в будущем. Обратные вызовы взаимодействуют как с данными приложения, так и с графическими объектами дескриптора, что, я полагаю, необходимо, но это предотвращает полную сегрегацию двух "половин" базы кода.
Итак, я ищу какую-то организационную/графическую поддержку. А именно:
- Существует ли структура каталогов, которую я должен использовать для организации? (Обратные вызовы и функции рисования?)
- Каким образом "правильный путь" взаимодействует с данными GUI и сохраняет его отдельно от данных приложения? (Когда я ссылаюсь на данные GUI, я имею в виду
set/get
ting свойства объектов handle). - Как я могу исключить все эти функции рисования в один гигантский файл из тысяч строк и до сих пор эффективно передавать данные приложения и GUI взад и вперед? Возможно ли это?
- Существует ли ограничение производительности, связанное с постоянным использованием
set/getappdata
? - Есть ли какая-либо структура моего внутреннего кода (3 класса объектов и куча вспомогательных функций), чтобы упростить поддержку с точки зрения графического интерфейса?
Я не программист по профессии, я просто знаю, что это опасно, поэтому я уверен, что это довольно простые вопросы для опытных разработчиков графического интерфейса (на любом языке). Я почти чувствую, что отсутствие стандарта дизайна GUI в MATLAB (существует ли он?) Серьезно мешает моей способности завершить этот проект. Это проект MATLAB, который намного более массивный, чем любой, который я когда-либо совершал, и мне никогда не приходилось много думать о сложных пользовательских интерфейсах с несколькими фигурными окнами и т.д. Раньше.