我是靠谱客的博主 追寻指甲油,这篇文章主要介绍qt 设置焦点 跳到下个控件_Qt控件焦点切换,现在分享给大家,希望可以做个参考。

们日常切换控件,例如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(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 l = first->findChildren();

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

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

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

WinForm设置控件焦点focus

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

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 ...

WinForm设置窗体默认控件焦点

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

WinForm设置控件焦点(转)

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

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

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

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

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

Qt控件样式 Style Sheet Demo

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

Qt 控件随窗口缩放

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

随机推荐

Hadoop学习笔记(1):概念和整体架构

Hadoop简介和历史 Hadoop架构体系 Master和Slave节点 数据分析面临的问题和Hadoop思想 由于工作原因,必须学习和深入一下Hadoop,特此记录笔记. 什么是hadoop? A ...

Enum.GetHashCode()的问题

先说一下,正常如果代码可以定义成枚举,我是比较倾向于定义成枚举的,类似这样: public enum Gender { /// /// 男 ///

Lua笔记(2)

函数高级特性 像新版c++一样,lua支持lambda表达式.也就是可以在函数内部声明函数.内层的函数可以访问外一层函数的局部变量. 一个函数以及它会访问到的外层函数的变量,称为闭包.这些变量又被称为 ...

AJax学习一

1.Ajax的准备工作,就是要先准备好服务器环境. 这边可以有好几种方式,例如服务器工具: http://www.php100.com/html/plugin/ser/2013/0905/91.htm ...

在Linux上配置vsftpd

一般安装好vsftpd这个服务,它的默认配置文件在这里:/etc/vsftpd/vsftpd.conf 用vim在里面可以添加一些变量控制权限之类的.还有很多chroot相关的东西,里面的变量都有作用 ...

Python模块探秘之smtplib,实现纯文本邮件的发送

今天学到了如何使用Python的smtplib库发送邮件,中间也是遇到了各种各样的错误和困难,还好都一一的解决了.下面来谈一谈我的这段经历. 配置你的邮箱 为什么要配置邮箱呢?具体要配置什么呢? 因为 ...

Mybatis源码之CallableStatementHandler

/** * @author Clinton Begin */ public class CallableStatementHandler extends BaseStatementHandler { ...

[物理学与PDEs]第4章第2节 反应流体力学方程组 2.3 混合气体状态方程

1.  记号与假设 (1)  已燃气体的化学能为 $0$. (2)  单位质量的未燃气体的化学能为 $g_0>0$. 2.  对多方气体 (理想气体当 $T$ 不高时可近似认为), $$bex ...

MySQL高级知识(八)——ORDER BY优化

前言:在使用order by时,经常出现Using filesort,因此对于此类sql语句需尽力优化,使其尽量使用Using index. 0.准备 #1.创建test表. drop table i ...

推特算法,分布式ID

package casclient_demo1.util; import java.lang.management.ManagementFactory; import java.net.InetAdd ...

最后

以上就是追寻指甲油最近收集整理的关于qt 设置焦点 跳到下个控件_Qt控件焦点切换的全部内容,更多相关qt内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(162)

评论列表共有 0 条评论

立即
投稿
返回
顶部