博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
qt 实现控件的模拟人类习惯的上下左右控制
阅读量:4636 次
发布时间:2019-06-09

本文共 2149 字,大约阅读时间需要 7 分钟。

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

你可能感兴趣的文章
navigator.geolocation的应用 - 将定位信息显示在百度地图上
查看>>
数据结构与算法-概念
查看>>
C学习笔记-字符串
查看>>
PHP-curl
查看>>
Jquery 多行拖拽图片排序 jq优化
查看>>
文件分割机
查看>>
shell的交互式和非交互式登录
查看>>
【转载】ASP.NET自定义404和500错误页面
查看>>
定长顺序串的实现
查看>>
使用var声明的变量 和 直接赋值并未声明的变量的区别
查看>>
[读书笔记]TCP/IP详解V1读书笔记-3
查看>>
Just a Hook HDU - 1698
查看>>
Polo the Penguin and Matrix
查看>>
简评知乎的优点与不足
查看>>
20分钟快速了解Redis
查看>>
[AHOI2009]最小割(最大流+tarjan)
查看>>
Nginx 动静分离
查看>>
Apache - Storm
查看>>
tkinter中scale拖拉改变值控件(十一)
查看>>
NB-IOT连接移动onenet平台流程
查看>>