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

發佈了27 篇原創文章 · 獲贊 1 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章