博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Qt之Tab键实现(自由切换焦点)
阅读量:4671 次
发布时间:2019-06-09

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

在Qt中,有一些特殊的按键比如说Tab键,默认Tab事件(切换焦点)被先捕获了,所以如果想自定义Tab键的使用应该如何实现呢?

  在实际需求中我主要是实现QLineEdit、QCheckBox、QPushButton、QToolButton之间的切换,可以根据自己的程序修改切换顺序。当然如果自己不去实现Tab键的功能,就像前面所言,Qt也会去捕获Tab键切换焦点,只不过顺序是死的!那么要想灵活的切换应该怎么实现呢?

 

1、安装事件过滤器

 realm_line_edit->installEventFilter(this); 

 user_line_edit->installEventFilter(this); 

 password_line_edit->installEventFilter(this); 

 check_box->installEventFilter(this);  login_button->installEventFilter(this);

 forgot_pwd_button->installEventFilter(this);  regist_button->installEventFilter(this);  

min_button->installEventFilter(this);  close_button->installEventFilter(this);

 

2、重写eventFilter(QObject *obj, QEvent *event)

 

bool LoginDialog::eventFilter(QObject *obj, QEvent *event)

{  

if(obj == realm_line_edit || obj == user_line_edit || obj == password_line_edit || obj == check_box ||   obj == login_button || obj == forgot_pwd_button || obj == regist_button || obj == min_button || obj == close_button)  

{   

if(event->type() == QEvent::KeyPress)   

{

   //将事件转化为键盘事件    QKeyEvent *key_event = static_cast(event);

   //按下Tab键执行焦点切换事件   

 if(key_event->key() == Qt::Key_Tab)  

  {     

 bool realm_edit_focus = realm_line_edit->hasFocus();    

 bool user_edit_focus = user_line_edit->hasFocus();  

   bool password_edit_focus = password_line_edit->hasFocus();

    bool check_box_focus = check_box->hasFocus();

    bool login_btn_focus = login_button->hasFocus();

    bool get_pwd_btn_focus = forgot_pwd_button->hasFocus();  

   bool register_btn_focus = regist_button->hasFocus();

    bool min_btn_focus = min_button->hasFocus();

    bool close_btn_focus = close_button->hasFocus();

    if(realm_edit_focus)

    {

     focusNextChild();

     user_line_edit->setFocus();

    }     

else if

(user_edit_focus)

    {

     focusNextChild();

     password_line_edit->setFocus();

    }

    else if(password_edit_focus)

    {  

    focusNextChild();    

  check_box->setFocus();   

  }     

else if(check_box_focus)   

  {   

   focusNextChild();   

   login_button->setFocus();  

   }   

    else if(login_btn_focus)  

   {   

   focusNextChild();   

   forgot_pwd_button->setFocus();  

   }     

   else if(get_pwd_btn_focus)   

  {   

   focusNextChild();  

    regist_button->setFocus();    

 }      

   else if(register_btn_focus)  

   {

     focusNextChild();

     min_button->setFocus();  

   }   

   else if(min_btn_focus)  

   {

     focusNextChild();

     close_button->setFocus();

    }

    else if(close_btn_focus)

    {

     focusNextChild();

     realm_line_edit->setFocus();

    }

    else

    {

     focusNextChild();

    }

    return true;

   }

  }

 }

 return QDialog::eventFilter(obj, event);

}

 

 在这里需要注意focusNextChild()把焦点传递到序列下一个窗口部件,这句话必须写上!然后就可以实现Tab键进行光标的自由切换了!

这里我主要是实现焦点的切换,如果要实现其他功能则直接修改Tab键中代码即可

 

注:
    技术在于交流、沟通,转载请注明出处并保持作品的完整性。
    作者:   原文: 。

转载于:https://www.cnblogs.com/blog-747674599/p/4243302.html

你可能感兴趣的文章
设计模式教程(Design Patterns Tutorial)笔记之一 创建型模式(Creational Patterns)...
查看>>
三 .数据库(表操作)
查看>>
Django 框架篇(七) : 中间件 以及 5种方法
查看>>
python 处理CSV数据
查看>>
tensorflow实战系列(三)一个完整的例子
查看>>
Mybatis:resultMap的使用总结
查看>>
使用U盘安装Ubuntu
查看>>
XFTP 乱码
查看>>
java Int数据工具类
查看>>
下载文件根据浏览器判断文件名,解决兼容性问题
查看>>
当网站不允许上传ASP,CGI,CER等脚本文件时
查看>>
Access 中数据库操作时提示from子句语法错误
查看>>
【备战NOIP】[算法总结] 二分查找
查看>>
sort函数用于vector向量的排序
查看>>
《算法》-- 总结
查看>>
El表达式
查看>>
leetcode-题8-3sum
查看>>
SQL-Server使用点滴(二-系统表)
查看>>
Djiango django跨域 cookie session
查看>>
vue通过webpack打包后怎么运行
查看>>