qt5 mouseless 多种部件切换带焦点高亮显示

这篇博客介绍了一个使用Qt5实现无鼠标操作的示例,通过键盘上下左右键移动焦点,并用确认键进行操作。代码展示了如何设置焦点部件的高亮显示,以及如何监听键盘事件进行焦点切换。示例中包括QToolButton、QCheckBox、QRadioButton等组件的焦点管理和键盘交互。
摘要由CSDN通过智能技术生成

如此这样就能使用上下左右键移动焦点,使用确认键来操作了。

想没想起来,以前的老式非智能机的时代,导航按键不就是 上下左右+确认吗???

上图吧。

上代码吧.

#include "zpage1.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    a.setStyleSheet("\
                    QToolButton:focus{background-color:yellow;}\
                    QCheckBox:focus{background-color:yellow;}\
                    QRadioButton:focus{background-color:yellow;}");
    ZPage1 w;
    w.show();

    return a.exec();
}

#ifndef ZPAGE1_H
#define ZPAGE1_H

#include <QWidget>
#include <QKeyEvent>
#include <QDebug>
#include <QGridLayout>
#include <QToolButton>
#include <zdialog1.h>
#include <zpage2.h>
class ZPage1 : public QWidget
{
    Q_OBJECT

public:
    ZPage1(QWidget *parent = 0);
    ~ZPage1();

protected:
    bool eventFilter(QObject *obj, QEvent *event);
private slots:
    void ZSlotBtnClicked();
private:
    QGridLayout *m_gridLayout;
    QToolButton *m_btnArray[20];
    ZPage2 *m_page2;
};

#endif // ZPAGE1_H

#include "zpage1.h"

ZPage1::ZPage1(QWidget *parent)
    : QWidget(parent)
{
    this->setStyleSheet("QToolButton{width:50px;height:30px;}");
    this->m_gridLayout=new QGridLayout;
    qint32 tX=0;
    qint32 tY=0;
    for(qint32 i=0;i<20;i++)
    {
        this->m_btnArray[i]=new QToolButton;
        this->m_btnArray[i]->installEventFilter(this);
        this->m_btnArray[i]->setText(QString("%1").arg(i+1));
        this->m_gridLayout->addWidget(this->m_btnArray[i],tX,tY);
        if(tX++>=5)
        {
            tY++;
            tX=0;
        }
        connect(this->m_btnArray[i],SIGNAL(clicked()),this,SLOT(ZSlotBtnClicked()));
    }
    this->setLayout(this->m_gridLayout);
    this->m_page2=new ZPage2;
}

ZPage1::~ZPage1()
{
    for(qint32 i=0;i<20;i++)
    {
        delete this->m_btnArray[i];
    }
    delete this->m_gridLayout;
    delete this->m_page2;
}
void ZPage1::ZSlotBtnClicked()
{
    QToolButton *btn=qobject_cast<QToolButton*>(sender());
    if(btn)
    {
        qDebug()<<"Button Clicked:"<<btn->text();
        if(btn==this->m_btnArray[2])
        {
            this->m_page2->setGeometry(100,100,400,300);
            this->m_page2->show();
        }
        if(btn==this->m_btnArray[3])
        {
            ZDialog1 tdia;
            tdia.exec();
        }
    }
}

bool ZPage1::eventFilter(QObject *obj, QEvent *event)
{
    if(event->type()==QEvent::KeyPress)
    {
        qint32 tCurFocusX;
        qint32 tCurFocusY;
        for(qint32 i=0;i<this->m_gridLayout->rowCount();i++)
        {
            bool bFindIt=false;
            for(qint32 j=0;j<this->m_gridLayout->columnCount();j++)
            {
                QLayoutItem *tItem=this->m_gridLayout->itemAtPosition(i,j);
                if(!tItem)
                {
                    continue;
                }
                QWidget *tFocusWidget=tItem->widget();
                if(tFocusWidget && tFocusWidget==this->focusWidget())
                {
                    qDebug()<<"oldPos:"<<i<<j;
                    tCurFocusX=i;
                    tCurFocusY=j;
                    bFindIt=true;
                    break;
                }
            }
            if(bFindIt)
            {
                break;
        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值