【问题标题】:MATLAB uitable row generation from user input从用户输入生成 MATLAB 合适的行
【发布时间】:2014-04-27 01:25:59
【问题描述】:

我在 MATLAB 中有一个 GUI,它使用 uitables 进行输入。有固定数量的列,每列都有一个非常特定的格式,我将其存储为单元格数组,如下所示:

columnformat = {'text', 'numeric', {@doSomething, inputArg1}, {'Option1' 'Option2'}};

理论上行数是无限的;用户可以提供他们喜欢的数量。后端能够处理任意多的行输入。现在,我最初正在构建一个大型 uitable,只是假设用户不会全部使用它。

问题是:我想设置表格和相关代码,以便在用户选择最后一行并按 Enter 键时,它会创建一个与表格其余部分格式相同的新行。

我尝试了许多不同的方法,包括动态设置“数据”,它们似乎都打破了元胞数组规定的自定义格式。我敢肯定以前有人这样做过。感谢您的帮助!

【问题讨论】:

  • 您愿意与使用MATLAB GUIDE 制作的uitable 合作吗?
  • 是的。有区别吗?我问是因为我都用过,而 GUIDE 创建的那个似乎不太稳定,更容易出现奇怪的行为。
  • 你能解释一下奇怪的行为吗?如果您使用的是 MATLAB GUIDE,我可能要补充一些内容。
  • 我正在使用 GUIDE,特别奇怪的行为是,当我提取数据、添加一行并重新分配时,列格式并未分配给新的数据行。跨度>
  • 只是好奇我的回答对你有用吗?我真的很想知道。

标签: matlab matlab-guide matlab-uitable


【解决方案1】:

此解决方案适用于使用 MATLAB GUIDE 创建的 GUI。我认为 MATLAB GUI 确实显示出奇怪的行为,但是在使用 keyboard 之类的东西调试 MATLAB 回调并且使用 dbquit 没有正确退出它们时,我看到了大多数奇怪的行为。因此,我的建议是不要对使用GUIDE 创建的 MATLAB GUI 使用键盘相关命令。

现在,回到解决您的问题,请按照以下步骤操作。

第 1 步:在 GUINAME__OpeningFcn 的开头添加:

handles.row_col_prev = [1 1];

第 2 步: 在上下文中单击表的属性,然后单击 CellSelectionCallback。因此,如果表的标签是uitable1,它将创建一个名为-uitable1_CellSelectionCallback的函数。

假设图形用户界面有标签-addrows_figure

在其中添加这些:

%%// Detect the current key pressed
currentkey = get(handles.addrows_figure,'CurrentCharacter')

%%// Read in previous row-col combination
prev1 = handles.row_col_prev

%%// Read in current data. We need just the size of it though.
data1 = get(handles.uitable1,'Data');

%%// Main processing where a row is appended if return is pressed
if numel(prev1)~=0
    if size(data1,1)==prev1(1) & currentkey==13 %%// currentkey==13 denotes carriage return in ascii
        data1(end+1,:) = repmat({''},1,size(data1,2)); %%// Append empty row at the end 
        set(handles.uitable1,'Data',data1); %%// Save it back to GUI
    end
end

%%// Save the current row-col combination for comparison in the next stage
%%// when selected cell changes because of pressing return
handles.row_col_prev = eventdata.Indices;
guidata(hObject, handles);

希望这对你有用!

【讨论】:

    【解决方案2】:

    我想不出用某个键来实现你想要的东西的可能性,我认为任何键都可以 (KeyPressFcn)。但我更推荐引入带有按钮的工具栏:

    h = figure(...
    u = uitable(h, ...
    set(u,'Tag','myTable')
    tbar = uitoolbar(h);
    uipushtool(tbar,'ClickedCallback',@addRow);
    

    在您的回调函数中,您需要获取数据,添加一行并将其写回:

    function addRow(~,~)
    
    u = findobj(0,'Type','uitable','Tag','myTable');
    data = get(u,'Data');
    %// modify your data, add a row ...
    set(src,'Data',data);
    
    end
    

    对不起,如果一切都有些简单且未经测试,但一个好的答案需要相当大的努力,我没有时间。标签可以给你很多进一步的想法。

    【讨论】:

    • 在这种情况下,工具栏解决方案有点不雅,因为 GUI 上下文。也就是说,你确实激发了一个答案,所以我给你接受的答案。
    • 我将要求更具体的后续行动,关于输入添加行功能。谢谢!
    猜你喜欢
    • 2013-06-23
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 2013-05-09
    相关资源
    最近更新 更多