MATLAB 之 App designer 小白學習(四)


續上學習(一、二、三)

三、示例學習

4.使用儀表控件

 (1)界面

  這次的界面主要以儀表控件為主,包括信號燈、分檔旋鈕、旋鈕、開關等。不做細節介紹。

 

 

 (2)代碼簡述

properties (Access = private)
        autoUpdate
    end

  系統自動更新:autoUpdate

p = generatePulse(app) ;

  產生脈沖

 if strcmp(plotType,'Pulse')

  strcmp() 會根據 ASCII 編碼依次比較 str1 和 str2 的每一個字符,直到出現不到的字符,或者到達字符串末尾(遇見\0)。

  返回值:

    • 如果返回值 < 0,則表示 str1 小於 str2。
    • 如果返回值 > 0,則表示 str2 小於 str1。
    • 如果返回值 = 0,則表示 str1 等於 str2。
lp=length(p);
Y=fft(p);
sig=abs(Y(1:ceil(lp/2)));
f=linspace(0, frequency/2, ceil(lp/2));
plot(app.PulsePlotUIAxes, f(sig>1e-4), sig(sig>1e-4));

  length():取字符串的長度;

  abs():取絕對值;

  linspace():inspace是Matlab中的一個指令,用於產生0 到 frequency/2 之間的ceil(lp/2) 步長的行矢量

  ceil函數:朝正無窮大方向取整

frequency = app.FrequencyEditField.Value ;
            signalLength = app.SignalLengthsEditField.Value ;
            edge = app.EdgeKnob.Value ;
            window = app.WindowKnob.Value ;
            modulation = str2double(app.ModulationKnob.Value) ;
            lowpass = app.LowPassKnob.Value ;
            highpass = app.HighPassKnob.Value ;
            dispersion = str2double(app.DispersionKnob.Value) ;

  對於旋鈕,調用語句為:XXX = app.Knob.Value

  對於分檔旋鈕,調用語句為:XXX= str2double(app.Knob.Value)

s = fft(y);
            sA = abs(s);
            sP = angle(s);

  fft():快速傅里葉變換;

  angle():  求復數相角,提取相位。

  本節內容主要講解旋鈕和分檔旋鈕的使用方法,其他部分多數為MATLAB指令含義。

四、編程思想

1.前言

  前文主要針對控件,根據教程實例學習了一番控件的調用、設置等基本操作。但事實上,除了學會使用之外,更重要的是要有系統的思維與編程思想用於指導整個App的編寫。下文將從App設計工具的整體思路入手,通過分析上文最后兩個實例,來闡述其中的編程思想。這種編程思想可借鑒在我們日后的編程實戰中。

2.App designer概述

  縱觀來看,App designer工具是一個可視化的集成開發環境,與labview、VB等編程軟件是同樣的編程思想,采用的面向對象的設計方法,但不同於Labview的圖形化編程語言,它的編程需要代碼鍵入,或許之后的更新發展會朝圖形化設計思路發展吧。

(1)App designer的打開

  在MATLAB命令行窗口輸入appdesigner命令。

  在MATLAB主窗口中選擇“主頁”選項卡,單擊工具欄“新建”命令按鈕,再選擇“應用程序”下的“APP Designer”命令。

(2)界面設計

  選擇空白模板進入:或根據需要,選擇三欄式、兩欄式的模板進入設計。

  進入后,在設計視圖的界面下,拖拽左邊的控件進入圖布,相應的根據功能修改控件的屬性

 

  此處,控件的選擇和使用是很關鍵的內容,這里羅列幾個前文未講清楚地控件,后面的學習文檔會逐一分析每個控件的詳細用法。

 

1)滑塊

 

控件

 

 

使用的回調

 

  滑塊共有兩個回調函數,分別是Slider_ValueChanging( )和Slider_ValueChanged( )。

 

  這兩個回調的區別是,第一個回調能實時地返回滑塊當前的值,而第二個滑塊則返回滑塊最后所處的位置的值即當用戶鼠標放開滑塊才會觸發回調。

 

  如果需要實時的變化,則使用第一個回調函數。

 

回調語句

 

 changingValue = event.Value;

 

 changingValue即為滑塊當前指示值。

 

2)按鈕

 

控件

 

 

使用的回調

 

Button_Pushed(app, event)

 

  當按鈕按下時,觸發回調函數。

 

 3)單選按鈕組

 

控件

 

 

使用的回調

 

  ButtonGroupSelectionChanged (app, event)

 

調用語句

 

function ButtonGroupSelectionChanged(app, event)
    selectedButton = app.ButtonGroup.SelectedObject;
    if isequal(get(selectedButton,'text'),'正弦')
        app.Interpolation_method='nearest';
    elseif isequal(get(selectedButton,'text'),'非正弦')
        app.Interpolation_method='bilinear';
    end   
end

 

(3)回調函數

  在代碼視圖中,除了前面文檔所述內容外,還應明白:

  在全局傳遞的參數,可在代碼中插入屬性

 

   例如:

classdef SN3 < matlab.apps.AppBase

    % Properties that correspond to app components
    properties (Access = public)
        UIFigure            matlab.ui.Figure
        FileMenu            matlab.ui.container.Menu
        EditMenu            matlab.ui.container.Menu
        GridLayout          matlab.ui.container.GridLayout
        LeftPanel           matlab.ui.container.Panel
        experimentPanel     matlab.ui.container.Panel
        LEditFieldLabel     matlab.ui.control.Label
        LEditField          matlab.ui.control.NumericEditField
        LDropDown           matlab.ui.control.DropDown
        LEditField_2Label   matlab.ui.control.Label
        LEditField_2        matlab.ui.control.NumericEditField
        LDropDown_2         matlab.ui.control.DropDown
        Button              matlab.ui.control.Button
        RightPanel          matlab.ui.container.Panel
        TabGroup            matlab.ui.container.TabGroup
        Tab                 matlab.ui.container.Tab
        qlUIAxes            matlab.ui.control.UIAxes
        AngleSliderLabel    matlab.ui.control.Label
        AngleSlider         matlab.ui.control.Slider
        Panel               matlab.ui.container.Panel
        CheckBox            matlab.ui.control.CheckBox
        LCheckBox           matlab.ui.control.CheckBox
        SCheckBox           matlab.ui.control.CheckBox
        plot1Button         matlab.ui.control.Button
        Label               matlab.ui.control.Label
        DropDown            matlab.ui.control.DropDown
        Label_2             matlab.ui.control.Label
        Tab_2               matlab.ui.container.Tab
        gxUIAxes            matlab.ui.control.UIAxes
        plot2Button         matlab.ui.control.Button
        Panel_2             matlab.ui.container.Panel
        CheckBox_2          matlab.ui.control.CheckBox
        CheckBox_3          matlab.ui.control.CheckBox
        DropDown_2Label     matlab.ui.control.Label
        DropDown_2          matlab.ui.control.DropDown
        AngleSlider_2Label  matlab.ui.control.Label
        AngleSlider_2       matlab.ui.control.Slider
        Tab_3               matlab.ui.container.Tab
        UITable             matlab.ui.control.Table
        Panel2              matlab.ui.container.Panel
        Label_3             matlab.ui.control.Label
        preEditField        matlab.ui.control.NumericEditField
        Tab_4               matlab.ui.container.Tab
    end

    % Properties that correspond to apps with auto-reflow
    properties (Access = private)
        onePanelWidth = 576;
    end

    
    properties (Access = private)
       L; % the original length
       L1 ; %add the danwei
       Q;%the max of the angle
       dQ;%the interval of the angle;
       Q1;
       dQ1;
       dL;
       dL1;
    end

   黃色部分為插入的屬性,由此,參數L; L1 Q;dQ;Q1;dQ1;dL;dL1;所代表的值可在app內部傳遞,在傳遞時,對變量的調用語句為

app.XXX

  

  隨后,可按照需求對每一個控件進行回調函數的編寫。這里還需強調一個內容:

  對子函數的編寫與調用:在編程中,某些重復性或者功能性相對獨立地代碼簇可封裝為一個函數,在之后的回調中直接調用

 

例如:

 properties (Access = private)
       L; % the original length
       L1 ; %add the danwei
       Q;%the max of the angle
       dQ;%the interval of the angle;
       Q1;
       dQ1;
       dL;
       dL1;
    end
    methods (Access = private)
        function Y1 = xishu(app,Theta,length,s,j)
          sym s
          v=sin(Theta/2);%定義角度
          k=ellipticK(v);%第一橢圓積分類完全
          varsigma=4*k/(length);
          X =2*ellipticE(jacobiAM(s*varsigma,v),v)/varsigma-s; %x坐標
          Y =2*v*(1-jacobiCN(s*varsigma,v))/varsigma;%Y坐標
          plot(app.qlUIAxes,X,Y)%x和y屈曲形狀
          G=diff(Y,1);
          V=diff(Y,2);
          Y1=1/(abs((((G(j+1))^2+1)^1.5)/V(j)));%曲線  
        end
        
        function H1 = H1(~,Theta)
          sym s
          v=sin(Theta/2);%定義角度
          k=ellipticK(v);%第一橢圓積分類完全
          l=2*ellipticE(jacobiAM(k,v),v)-k;
          H1=1-l/k;
        end
    end

  

   黃色部分為插入的兩個函數,在其后的調用,可直接采用語句

xishu(app,i,app.L1,s,j);

  最后,值得注意的是,靈活運用對話框、編程控制控件的狀態、多窗口化、個性化設計等多個手段可優化app界面的美觀、人機交互的便利等。這些內容將在后面的菜鳥進階中一起學習。

  至此,小白算是真正入門了,下面邁入菜鳥階段吧!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM