Qt之Tab键实现(自由切换焦点)

在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键中代码即可

注:

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

作者:╰☆奋斗ing?孩子`  原文:http://blog.sina.com.cn/s/blog_a6fb6cc90101ayuo.html

时间: 2024-10-21 15:09:35

Qt之Tab键实现(自由切换焦点)的相关文章

修复duilib CEditUI控件和CWebBrowserUI控件中按Tab键无法切换焦点的bug

转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/41556615 在duilib中,按tab键会让焦点在Button一类的控件中切换,但是切换焦点一直存在bug,具体的描述如下: 1.在主窗体里弹出新的窗体,当新窗体中存在CEditUI控件并且焦点在此CEditUI控件上,那么按tab键将无法切换焦点而一直处于CEditUI中.(只在新窗体中有此bug,主创体中没有,原因会在后面分析) 2.CWebBrowserUI控件

[C#]Winform下回车或Tab键自动切换下一个控件焦点

满足用户体验,在数据录入时,能在输入完一个信息后通过回车或Tab键自动的切换到下一个控件(字段). 在界面控件设计时,默认可以通过设置控件的TabIndex来实现.但在布局调整时或者是对输入的内容有选择性时,从用代码的方式来处理显得更好维护一点. 完整的实现方法如下: /// <summary> /// 回车.Tab键盘切换或执行操作 /// </summary> public sealed class TabEnter:IDisposable { private List<

WEB 页面 控制表单内tab键切换的顺序

在Html代码中有一个键盘属性——tabindex,它可以设置访问者在页面中按tab键的顺序.如下: <input type="button" id="b1" tabIndex="1" value="Button1" /> <input type="button" id="b2" tabIndex="2" value="Button2&qu

(转)js控制窗口失去焦点(包括屏蔽Alt+Tab键切换页面)

本章内容转自:http://www.cnblogs.com/BoKeYuanVinson/articles/3360954.html 转载自网络贴吧: 页面脚本是无法截获alt键的,不过可以变通一下,我想你是希望学生不要切换出当前浏览器窗口,要达到这个目的可以不必截获alt+tab,而改用window.onblur(),这个事件在当前页面失去焦点时触发,这样以来,我们就可以在考试开始之前声明:"如果做窗口切换,将导致系统立刻交卷,而不管你是否已经完成",然后,在页面的头部写上类似下面的

切换tab键,不聚焦a标签

系统input type="text"的输入框后面有a标签,组成了是否显示密码的控件.在使用tab键时,非常容易由前面的input标签直接切换到了后面的a标签,而不是下一个input标签. 我之前的处理办法是,将a标签的tabindex属性设置为一个比较大的数字.例如1000 在看<html5权威指南>的时候发现一种更好的方式.就是将其设置为-1 这样,再如何切换,都不会聚焦在a标签上了.

WinForm中变Enter键为Tab键实现焦点转移的方法

if (e.KeyCode == Keys.Enter) { //this.SelectNextControl(this.ActiveControl,true, true, true, true); SendKeys.Send("{Tab}"); //向活动应用程序发送击键 注意格式:Send("{Tab}");中的{} } /// <summary> /// 窗体控件控制相关的方法 /// </summary> public class C

html页面中改变TAB键的切换顺序

html中的tabIndex属性可以设置键盘中的TAB键在控件中的移动顺序,即焦点的顺序. 把控件的tabIndex属性设成1到32767的一个值,就可以把这个控件加入到TAB键的序列中. 这样,当浏览者使用TAB键在网页控件中移动时,将首先移动到具有最小tabIndex属性值的控件上,最后在具有最大tabIndex属性值的控件上结束移动. 如果有两个控件的tabIndex属性相同,则以控件在html代码中出现的顺序为准.默认的tabIndex属性为 0 ,将排列在在所有指定tabIndex的控

Qt中的键盘事件,以及焦点的设置(比较详细)

Qt键盘事件属于Qt事件系统,所以事件系统中所有规则对按键事件都有效.下面关注点在按键特有的部分: focus 一个拥有焦点(focus)的QWidget才可以接受键盘事件.有输入焦点的窗口是活动窗口或活动窗口子窗口或子子窗口等. 焦点移动的方式有以下几种: 按下Tab或Shift+Tab 注意:文本编译器(一般需要插入Tab),或者WebView(需要Tab来移动超链接焦点) 等 Qt中,需要输入Tab的地方可以用 Ctrl+Tab 或 Ctrl+Shift+Tab 替代. 点击一个QWidg

点击enter回车键实现表单元素切换焦点效果

点击enter回车键实现表单元素切换焦点效果:现在网站都比较追求人性化,比如填写表单的时候,能够实现点击回车就可以切换表单元素的焦点,这样比使用鼠标进行切换更能让人接受,下面就通过代码实例介绍一下如何实现此功能.代码如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://w