如何对 FLTK 中的小部件进行排序以使箭头键导航正常工作?
Posted
技术标签:
【中文标题】如何对 FLTK 中的小部件进行排序以使箭头键导航正常工作?【英文标题】:How to sort widgets in FLTK for arrow key navigation to work? 【发布时间】:2014-03-19 17:02:31 【问题描述】:FLTK 文档说:
箭头、tab 和 shift+tab 键“导航”选择。向左、向右、制表符或 shift+tab 移动到层次结构中的下一个或上一个小部件。 如果导航似乎不起作用,您可能需要“排序”小部件。 如果您有输入字段,这很重要,因为 FLTK 在使用箭头键在输入字段之间移动时使用相同的规则。
我的项目有以下几个特点:
-
许多小部件是随意创建和删除的,这使得跟踪小部件的创建顺序变得很困难(默认导航工作基于此顺序)
小部件有不同的类型、输入、输出、按钮等。
我已经完成了 Fl::option(Fl::OPTION_ARROW_FOCUS, 1) 来启用箭头导航,这样箭头导航就不会导致焦点(光标)停留在文本字段中。
“对小部件进行排序”是什么意思?如何对小部件进行排序以便直观地进行导航?有什么算法吗?
谢谢。
【问题讨论】:
通过排序,它们可能意味着(重新)在组内以特定顺序创建小部件。 【参考方案1】:您可以按如下方式进行排序:
void User_Group :: SortWidgets()
Fl_Widget *pt[TOTAL_WIDGETS], *temp;
int i, j, TotalNoOfChild = children();
//----------INITIALIZE TO NULL THE CHILD ARRAY *pt[]----------
for (i = 0; i < TOTAL_WIDGETS; i++)
pt[i]= NULL;
//----------COPYING CHILDREN FROM THE GROUP INTO POINTER ARRAY *pt[]----------
for (i = 0; i < TotalNoOfChild; i++)
pt[i]= (child(i));
//----------REMOVING CHILDREN FROM CHILDREN FROM THE GROUP----------
while (children() > 0)
remove(0);
//----------SORTING CHILD ARRAY *pt[] ACCORDING TO CO-ORDINATES----------
for (i = 0; i < TotalNoOfChild + 1; i++)
for (j = i + 1; j < TotalNoOfChild; j++)
if ((pt[i]->y()) > (pt[j]->y()))
temp=pt[i];
pt[i]=pt[j];
pt[j]=temp;
for (i = 0; i < TotalNoOfChild + 1; i++)
for (j = i + 1; j < TotalNoOfChild; j++)
if (((pt[i]->x())>(pt[j]->x())) && ((pt[i]->y()) >= (pt[j]->y())))
temp=pt[i];
pt[i]=pt[j];
pt[j]=temp;
/*
//----------ALTERNATE SORTING----------
for (i = 0; i < TotalNoOfChild + 1; i++)
for (j = i+1; j < TotalNoOfChild; j++)
if (((pt[i]->y())*1000+(pt[i]->x()))>((pt[j]->y())*1000+(pt[j]->x())))
temp=pt[i];
pt[i]=pt[j];
pt[j]=temp;
*/
//----------RE-ADDING CHILDREN INTO THE GROUP----------
for (i = 0; i < TotalNoOfChild; i++)
add(pt[i]);
【讨论】:
以上是关于如何对 FLTK 中的小部件进行排序以使箭头键导航正常工作?的主要内容,如果未能解决你的问题,请参考以下文章
在使用 keyPressEvent 子类化 QTableView 后,我失去了对箭头键的使用。如何在保持自定义信号的同时轻松使用它们进行导航?