qt 实现控件的模拟人类习惯的上下左右控制
为了做一个项目是嵌入式开发所以需要按键操作界面,所以需要一个可以模拟人类习惯的上下左右按键的控制。但是qt,不知道为什么keypress不支持上下左右的按键响应,所以在不利用到eventfilter的情况下只能,转换了wsad的四个按键。
算法思想如下:其实也不算是什么算法吧。
有两个主要的函数,一个函数负责获取到任何控件对应主界面的相对位置,另一个函数负责判断控件的上下左右位置,加入到一个临时的list中,然后通过如果按上,那么左右对其影响大的想法,获得最小距离的那个,具体算法可以下载代码看很简单。如图:
比如最开始的焦点在1控件,如果我按上那么就会先拿到所有比1控件高的控件,然后计算juli最小的,首先按照人类的思想按上应该是跳到2控件,计算公式是2控件对于1控件 =1*10+5*0=15, 而3控件对于1控件的位置是=1*6+5*10=56, 15《56所以选择2控件,基本上就是这样的思想。
这里用了递归调用,主要是为了逐步获取控件及坐标。经过使用还是不错的不过还是有一些小问题,算法不够好呵呵。
以下是代码: 这是向右的获得当前控件右端控件的方法
void Keyboard_Control::PushINListRight(QObjectList *ControlList, QObject *Ctrl,QObject *CurrentCtrl) { QString Name=Ctrl->metaObject()->className(); if(Name.compare("QWidget")==0) { QObjectList childlist=Ctrl->children(); if(childlist.count()>0) { foreach (QObject *childobj, childlist) { PushINListRight(ControlList,childobj,CurrentCtrl); } } } else if(Name.compare("QLineEdit")==0||Name.compare("QPushButton")==0||Name.compare("QComboBox")==0||Name.compare("QDoubleSpinBox")==0) { if(((QWidget*)Ctrl)->isEnabled()==true&&((QWidget*)Ctrl)->isVisible()==true){ int x=Get_MainPos(Ctrl).x(); int y=Get_MainPos(Ctrl).y(); int Height=Get_MainPos(Ctrl).x()-Get_MainPos(CurrentCtrl).x(); if(Height>0) { ControlList->append(Ctrl); } } } else if(Name.compare("QVBoxLayout")==0) { QObjectList childlist2=Ctrl->children(); if(childlist2.count()>0) { foreach (QObject *childobj2, childlist2) { PushINListRight(ControlList,childobj2,Ctrl); } } } }
获得相对于主界面相对坐标的方法
QPoint Keyboard_Control::Get_MainPos(QObject *Ctrl) { QString Parents=((QWidget*)Ctrl)->parent()->metaObject()->className(); if(Parents.compare("cy_main")==0) { return ((QWidget*)Ctrl)->pos(); } else { QWidget *temp=((QWidget*)Ctrl)->parentWidget(); QString ParentName=temp->metaObject()->className(); QPoint x=temp->mapToParent(((QWidget*)Ctrl)->pos()); while(ParentName.compare("cy_main")!=0) { temp=temp->parentWidget(); ParentName=temp->metaObject()->className(); x=temp->mapToParent(x); } return x; } }
其他函数主要是调用和判断了。
至此,基本上介绍了这个实现的方法和思想,不知道有没有帮助,代码和实例的下载连接如下:稍后上传
http://download.csdn.net/detail/bjut_yue/5332202