们日常切换控件,例如QQ登陆的账号和密码输入框就可以通过Tab键切换焦点。 
 
图1 qq切换焦点 
Qt中QWidget提供了一个静态方式实现该效果 
其中也包含介绍使用

[static] void QWidget::setTabOrder(QWidget *first, QWidget *second)
Puts the second widget after the first widget in the focus order.
Note that since the tab order of the second widget is changed, you should order a chain like this: setTabOrder(a, b); // a to b
setTabOrder(b, c); // a to b to c
setTabOrder(c, d); // a to b to c to d not like this: // WRONG
setTabOrder(c, d); // c to d
setTabOrder(a, b); // a to b AND c to d
setTabOrder(b, c); // a to b to c, but not c to d If first or second has a focus proxy, setTabOrder() correctly substitutes the proxy.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

实现效果如下 
 
图2 Tab切换焦点 
主要部分源码

    QPushButton *p = new QPushButton("按钮");
QLineEdit *l = new QLineEdit("输入框");
QCheckBox *c = new QCheckBox("复选框");
QComboBox *b = new QComboBox;
setTabOrder(p, l);
setTabOrder(l, c);
setTabOrder(c, b);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

当然也可以让控件屏蔽焦点的使用,或者接受响应其他类型的焦点方式 
主要使用

void setFocusPolicy(Qt::FocusPolicy policy)
  • 1

其中Qt::FocusPolicy 这个枚举类型定义了一个控件可以用来获取键盘焦点的各种策略。

Constant Value Description
Qt::TabFocus 0x1 the widget accepts focus by tabbing.
Qt::ClickFocus 0x2 the widget accepts focus by clicking.
Qt::StrongFocus TabFocus | ClickFocus | 0x8 he widget accepts focus by both tabbing and clicking. On macOS this will also be indicate that the widget accepts tab focus when in ‘Text/List focus mode’.
Qt::WheelFocus StrongFocus | 0x4 like Qt::StrongFocus plus the widget accepts focus by using the mouse wheel.
Qt::NoFocus 0 the widget does not accept focus.

例如设置 
QCheckBox为NoFouse

c->setFocusPolicy(Qt::NoFocus);
  • 1

效果如下 
 
图3 复选框设置NoFocuse 
函数

[slot] void QWidget::setFocus() //可通过信号槽方式设置
This is an overloaded function.
Gives the keyboard input focus to this widget (or its focus proxy) if this widget or one of its parents is the active window.
  • 1
  • 2
  • 3

可直接设置焦点

接下来可以看一下Qt是怎么实现焦点切换的,查看qwidget.cpp源码

void QWidget::setTabOrder(QWidget* first, QWidget *second)
{
//如果这两个控件都设置为没有焦点则不进行焦点设置,如图3中所示
if (!first || !second || first->focusPolicy() == Qt::NoFocus || second->focusPolicy() == Qt::NoFocus)
return; /******************************************************************
QWidget *QWidget::window() const
{
QWidget *w = const_cast<QWidget *>(this);
QWidget *p = w->parentWidget();
while (!w->isWindow() && p) {
w = p;
p = p->parentWidget();
}
return w;
}
******************************************************************/
//查看当前控件“祖先”(ancestor widget)窗口,见上面代码
if (Q_UNLIKELY(first->window() != second->window())) {
qWarning("QWidget::setTabOrder: 'first' and 'second' must be in the same window");
return;
} //找到first或其子类中焦点的控件(不是很懂)
QWidget *fp = first->focusProxy();
if (fp) {
QList<QWidget *> l = first->findChildren<QWidget *>();
for (int i = l.size()-1; i >= 0; --i) {
QWidget * next = l.at(i);
if (next->window() == fp->window()) {
fp = next;
if (fp->focusPolicy() != Qt::NoFocus)
break;
}
}
first = fp;
} if (fp == second)
return; if (QWidget *sp = second->focusProxy())
second = sp; //双向链表存储焦点触发控件顺序
// QWidget *fp = first->d_func()->focus_prev;
QWidget *fn = first->d_func()->focus_next; if (fn == second || first == second)
return; QWidget *sp = second->d_func()->focus_prev;
QWidget *sn = second->d_func()->focus_next; fn->d_func()->focus_prev = second;
first->d_func()->focus_next = second; second->d_func()->focus_next = fn;
second->d_func()->focus_prev = first; sp->d_func()->focus_next = sn;
sn->d_func()->focus_prev = sp; //查错
Q_ASSERT(first->d_func()->focus_next->d_func()->focus_prev == first);
Q_ASSERT(first->d_func()->focus_prev->d_func()->focus_next == first); Q_ASSERT(second->d_func()->focus_next->d_func()->focus_prev == second);
Q_ASSERT(second->d_func()->focus_prev->d_func()->focus_next == second);
}

http://blog.csdn.net/gx864102252/article/details/72731992

Qt控件焦点切换的更多相关文章

  1. C#中方向键与回车键切换控件焦点

    环境:界面上有TextBox,ComboBox等控件. 不建议把左右方向键都用来切换焦点,否则你在TextBox里面改变光标所在字符位置就不方便了. 方法一:笨方法,需为每个控件单独注册事件处理 以T ...

  2. WinForm设置控件焦点focus

    winform窗口打开后文本框的默认焦点设置,进入窗口后默认聚焦到某个文本框,两种方法: ①设置tabindex 把该文本框属性里的tabIndex设为0,焦点就默认在这个文本框里了. ②Winfor ...

  3. Cocos2dx 把 glview 渲染到 Qt 控件上(Mac 环境)

    本文原链接:http://www.cnblogs.com/zouzf/p/4423256.html 环境:Mac 10.9.2   Xcode5.1.1  Qt5.3  cocos2dx-2.2.4 ...

  4. WinForm设置窗体默认控件焦点

    winform窗口打开后文本框的默认焦点设置,进入窗口后默认聚焦到某个文本框,两种方法: ①设置tabindex 把该文本框属性里的tabIndex设为0,焦点就默认在这个文本框里了. ②Winfor ...

  5. WinForm设置控件焦点(转)

    http://blog.csdn.net/zlwzlwzlw/article/details/8573921 winform窗口打开后文本框的默认焦点设置,进入窗口后默认聚焦到某个文本框,两种方法: ...

  6. WPF 程序如何跨窗口/跨进程设置控件焦点

    原文:WPF 程序如何跨窗口/跨进程设置控件焦点 WPF 程序提供了 Focus 方法和 TraversalRequest 来在 WPF 焦点范围内转移焦点.但如果 WPF 窗口中嵌入了其他框架的 U ...

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

    满足用户体验,在数据录入时,能在输入完一个信息后通过回车或Tab键自动的切换到下一个控件(字段). 在界面控件设计时,默认可以通过设置控件的TabIndex来实现.但在布局调整时或者是对输入的内容有选 ...

  8. Qt控件样式 Style Sheet Demo

    迟来的笔记,作为一个程序员每日记事已养成习惯,离开许久,不知不觉已喜欢用文字表达对技术的热爱,学无止境! Qt – 一个跨平台应用程序和UI开发框架:它包括跨平台类库.集成开发工具和跨平台 IDE,使 ...

  9. Qt 控件随窗口缩放

    在Qt的界面设计中,我们有时候希望窗口在最大化的时候,上面的控件也跟着缩放,那么我们就需要调整控件的SizePolicy属性,关于这个属性的讲解请参见我之前的博客Qt SizePolicy 属性,由于 ...

随机推荐

  1. Oracle内存管理(之四)

    [深入解析--eygle]学习笔记 1.3 SGA管理 SGA指系统全局区(System Global Area),是一块用于载入数据.对象并保存执行状态和数据库控制信息的一块内存区域,在数据库实例启 ...

  2. Vmware P2V 清除被隱藏網卡佔用的的IP

    修改註冊表也可以讓非正常卸載的網卡釋放捆綁的固定的IP地址,註冊表中定位於中:HKEY_LOCAL_MACHINE \SYSTEM\ CurrentControlSet\Services\Tcpip\ ...

  3. hadoop集群中的日志文件 分类: A1_HADOOP 2015-02-28 20:37 680人阅读 评论(0) 收藏

    hadoop存在多种日志文件,其中master上的日志文件记录全面信息,包括slave上的jobtracker与datanode也会将错误信息写到master中.而slave中的日志主要记录完成的ta ...

  4. php 下载服务器上存在的文件 到本地

    Header("Location: http://www.weiyunyi.com/Public/youbu_score_template.xls");

  5. .NET Framework基础知识(三)(转载)

    .正则表达式:用一串字符验证是否符合一种规范,这个规范就是正则表达式. .正则表达式中常用的元字符: . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字 \s 匹配空白符 \d 匹配数 ...

  6. css强制不换行 多出的字省略号

    width: 100%;//需要指定宽度 overflow: hidden;//溢出隐藏 text-overflow: ellipsis; white-space: nowrap;//强制不换行 te ...

  7. Annotation研究的一些学习资料

    转自chanyinhelv原文Annotation研究的一些学习资料 下面是我最近对Annotation研究的一些学习资料,收集于此,供大家学习之用. 一.Annotation要素类介绍 在GeoDa ...

  8. AE创建拓扑

    转自原文 AE创建拓扑 /// <summary> /// 创建拓朴 /// </summary> /// <param name="featureWorksp ...

  9. Linux文件编辑命令具体整理

    刚接触Linux,前几天申请了个免费体验的阿里云server,选择的是Ubuntu系统.配置jdk环境变量的时候须要编辑文件. vi命令编辑文件,百度了一下,非常多回答不是非常全面,因此编辑文件话了一 ...

  10. iOS过场动画调研笔记

    前言 因项目须要,近期一段时间都在调研iOS的过场动画.对于我来说这是一个之前没有太涉及的领域,所以有必要把调研的过程和自己的一些理解纪录下来 为什么要自己定义过场动画? 假设大家有关注Materia ...