2

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

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

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

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

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

4

2 回答 2

2

此解决方案适用于使用MATLAB GUIDE. 我认为 MATLAB GUI 确实显示出奇怪的行为,但是我在使用类似的东西调试 MATLAB 回调时看到了大多数奇怪的行为,而keyboard使用dbquit. 因此,我的建议是不要对使用GUIDE.

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

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

handles.row_col_prev = [1 1];

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

假设 GUI 的图形有标签 -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);

希望这对你有用!

于 2014-04-26T17:25:59.260 回答
1

我想不出用某个键来实现你想要的东西的可能性,我认为任何键 ( 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

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

于 2014-04-26T10:01:46.873 回答