qt 实现控件的模拟人类习惯的上下左右控制

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

转载于:https://www.cnblogs.com/yueshen-blog/archive/2013/05/05/3182781.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值