• 【Qt】Qt之Tab键切换焦点顺序【转】


    简介

    Qt的窗口部件按用户的习惯来处理键盘焦点。也就是说,其出发点是用户的焦点能定向到任何一个窗口,或者窗口中任何一个部件。

    焦点获取方式比较多,例如:鼠标点击、Tab键切换、快捷键、鼠标滚轮等。

    习惯性的,我们经常会使用Tab键来控制焦点顺序,比如:用户注册时,个人信息输入框焦点的切换、执行按钮焦点的切换等。

    效果

    这里写图片描述

    实现方式

    接口说明:

    static void QWidget::setTabOrder(QWidget * first, QWidget * second)

    Puts the second widget after the first widget in the focus order.

    也就是说,按下Tan键后,焦点会从第一个控件切换到第二个控件。

    注意,如果第二个控件Tab顺序改变,则应该这样设置一个顺序链:

    //设置a、b、c、d顺序
    setTabOrder(a, b);  //a->b
    setTabOrder(b, c);  //a->b->c
    setTabOrder(c, d);  //a->b->c->d

    而不是这样:

    //错误
    setTabOrder(c, d);  // c->d
    setTabOrder(a, b);  // a->b 和 c->d
    setTabOrder(b, c);  // a->b->c, 但不是c->d

    源码

    这里以三个按钮如三个输入框为例,来说明Tab的顺序。

    设置获取焦点时的样式,以便我们更清楚的观看效果。

    QPushButton *pButton1 = new QPushButton(this);
    QPushButton *pButton2 = new QPushButton(this);
    QPushButton *pButton3 = new QPushButton(this);
    
    QLineEdit *pLineEdit1 = new QLineEdit(this);
    QLineEdit *pLineEdit2 = new QLineEdit(this);
    QLineEdit *pLineEdit3 = new QLineEdit(this);
    
    pButton1->setText("1");
    pButton2->setText("3");
    pButton3->setText("5");
    
    pLineEdit1->setText("6");
    pLineEdit2->setText("4");
    pLineEdit3->setText("2");
    
    pButton1->setStyleSheet("QPushButton:focus{border:none; background: green; color: white;}");
    pButton2->setStyleSheet("QPushButton:focus{border:none; background: green; color: white;}");
    pButton3->setStyleSheet("QPushButton:focus{border:none; background: green; color: white;}");
    
    pLineEdit1->setStyleSheet("QLineEdit:focus{border:2px solid green;}");
    pLineEdit2->setStyleSheet("QLineEdit:focus{border:2px solid green;}");
    pLineEdit3->setStyleSheet("QLineEdit:focus{border:2px solid green;}");
    
    QWidget::setTabOrder(pButton1, pLineEdit3);
    QWidget::setTabOrder(pLineEdit3, pButton2);
    QWidget::setTabOrder(pButton2, pLineEdit2);
    QWidget::setTabOrder(pLineEdit2, pButton3);
    QWidget::setTabOrder(pButton3, pLineEdit1);

    就这样,简简单单的一个接口解决了我们的问题。有兴趣的小伙伴可以看下focusNextChild


    原文作者:一去丶二三里
    作者博客:去作者博客空间
    作者:芝麻科技
    出处:芝麻麻雀-Asp.Net学习之路
    技术:C++,C#
    向我打赏
    加我微信,聊一聊技术
  • 相关阅读:
    python基础6 迭代器 生成器
    Netty入门之客户端与服务端通信(二)
    Netty入门之HelloWorld
    Java并发之BlockingQueue的使用
    Java并发之Semaphore的使用
    Java并发之CyclicBarria的使用(二)
    Java并发之CyclicBarria的使用
    Java并发之CountDownLatch的使用
    MongoDB的下载与安装
    Hibernate5.2之反向工程
  • 原文地址:https://www.cnblogs.com/mzy-google/p/5162112.html
Copyright © 2020-2023  润新知