今天调试登录框的时候,发现登录框出现的时候,发现focus不在密码输入框中。就四处查焦点问题,以及tab键的焦点调转顺序。
首先要感谢这篇文章: 【QT】新弹窗默认无焦点
给了我一个思路,我能不能在窗口show出来之后,或者show事件中知道当前的focus在哪个控件上?
如果你是界面是继承自QWidget的话:

void ResetPasswordDialog::showEvent(QShowEvent *event)
    if(this->focusWidget()){
        qDebug() << this->focusWidget()->objectName();
    QWidget::showEvent(event);

如果是继承自QDialog,可以这样:

void ResetPasswordDialog::showEvent(QShowEvent *event)
    if(this->focusWidget()){
        qDebug() << this->focusWidget()->objectName();
    QDialog::showEvent(event);

为了更形象地说明什么是objectName,我这里截一张图:
在这里插入图片描述
最终发现我的登录框出现的时候,焦点是有的,但它在窗体上,不在输入框里。

ui->accountLineEdit->setFocus();

其实只要一行代码就解决了问题,刚才的那行可以写在构造函数里。

问题二:
我希望我的Tab顺序是在账号框和密码框来回跳,又该怎么做呢?
其实这个问题跟我们的focusePolicy有关系的。

setTabOrder(ui->accountLineEdit, ui->passwordLineEdit);

也是一行代码。
但是你发现,连续按tab键的时候,怎么会出现,账号框->密码框->焦点不知道去哪里了->账号框->密码框…这样循环往复。
怎么让按tab键的时候,只在账号框和密码框来回跳?
这个也简单:
去检查你的界面的空间,包括QWidget窗体的焦点策略,要设置为NoFocus
在这里插入图片描述
或者是代码哪里有调用这个函数:

void setFocusPolicy(Qt::FocusPolicy policy)

最后说一句:有人会说,怎么某个焦点时候有虚线框?那个虚线框其实就是告诉你这个控件以及处于focus状态了。
怎么去掉它?
其中一种办法是用qss设置。
举例:

this->setStyleSheet("QLineEdit:focus {background:white; border:1px groove lightgray; border-radius:2px}");

回车键对控件焦点的跳转问题,我们下回再分解。

参考:
【QT】新弹窗默认无焦点
QLineEdit 仿QQ签名框(思路很独特:用QSS::hover显示额外的图片)
Qt 焦点窗口

今天调试登录框的时候,发现登录框出现的时候,发现focus不在密码输入框中。就四处查焦点问题,以及tab键的焦点调转顺序。首先要感谢这篇文章:【QT】新弹窗默认无焦点给了我一个思路,我能不能在窗口show出来之后,或者show事件中知道当前的focus在哪个控件上?如果你是界面是继承自QWidget的话:void ResetPasswordDialog::showEvent(QShowEv... enum Qt::FocusPolicy This enum type defines the various policies a widget can have with respect to acquiring keyboard focus. 枚举类型定义了小部件在获取键盘焦点方面可以具有的各种策略。 Constant
Qt父窗口与子窗口间的焦点传递问题的完美解决方案(简便实用)@Qt Qt焦点传递Bug问题完美解决方案 本文主要针对的问题为父窗口与子窗口的焦点传递问题,这里主要针对父窗口焦点如何传递给子窗口。本人由于需要做数控系统二次开发软件,不得不使用焦点的传递,而在切换中出现了问题,且搜索了很多方案,发现涉及较少,且全部没用!!!!是全部没用,而且很麻烦,最终五个小时摸索了一种容易解决的方案!!!可能菜叭,不喜勿喷! 网络搜索方案问题汇总 这里总结一下网络搜索和自己试探的各种方案的问题,主要是总结Qt这个焦点传递的硬
mywidget.activateWindow() mywidget.setFocus() void myWidget::focusInEvent(QFocusEvent *event) this.childa 但是有些时候这样也不会获得焦点,比如当自己内部需要setFocus的时候。可以通过focusOutEvent() or focusInEvent()来实现。 void my
ui.pushButton->setFocus(); //设置默认焦点 ui.pushButton->setShortcut( QKeySequence::InsertParagraphSeparator ); //设置快捷键为键盘的“回车”键 ui.pushButton->setShortcut(Qt::Key_Enter); //设置快捷键为enter键 ui.pushButton->setShortcut(Qt::Key_Return); //设置快捷键为小键盘上的e
首先来说说为什么要设置焦点吧。 设置焦点可以让应用更便捷。比如当你打开百度主页或其他带有编辑框的页面时,不需要先用鼠标点击编辑框就可以直接输入文字等信息到其中。这就是由于搜索框设置焦点。 一个空间要先设置焦点事件的模式,即窗口如何接受焦点事件(通过鼠标单击、Tab键、不接受焦点事件等)
项目场景:最近写了个Dialog界面,其中有两个SpinBox控件,监测SpinBox值变化时,重新执行计算,锁定了键盘输入,只响应键盘上下键和回车,但点击回车总是执行的清空数据方法。 通过设置Focus策略解决。
鼠标穿透: 默认情况下, 多层嵌套窗口各层全都会接收到鼠标事件(只要重写了鼠标事件函数), 而当加入以下函数调用后, 当前窗口将会透过鼠标点击事件(即该窗口对鼠标事件不在响应, 即使重写了鼠标事件函数)。注意参数第二项设为false时将恢复默认。 setAttribute(Qt::WA_TransparentForMouseEvents, true); 键盘焦点代理: 这里的`background.jpg`是你想要设置的背景图片的文件名,需要将其放置在Qt项目的资源文件夹中。同时,`#widget`是窗口的ID,可以根据实际情况进行修改。 3. 点击“应用”按钮保存修改,然后重新编译并运行程序,即可看到窗口的背景图已经设置成功。 注意:如果你想设置其他控件的背景图,可以将`#widget`替换为相应的控件ID。