如何对 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 中的小部件进行排序以使箭头键导航正常工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用箭头键更改小部件之间的焦点?

FLTK 中的居中小部件

fltk-1.3.5 小部件上的视觉工件

在使用 keyPressEvent 子类化 QTableView 后,我失去了对箭头键的使用。如何在保持自定义信号的同时轻松使用它们进行导航?

手机箭头键怎么设置

WPF:如何在不禁用箭头键导航的情况下禁用选项卡导航?