QtQuick.Controls 2.12 不显示按钮焦点

pec*_*eco 2 qt qml qtquickcontrols2

我正在使用QtQuick.Controls 2.12,我试图显示带有 3 个按钮的窗口,其中一个按钮将具有焦点。使用QtQuick.Controls 1.4一切都很好,并且Button1具有焦点(蓝色边框):

在此输入图像描述

但对于QtQuick.Controls 2.12,结果是这样的:

在此输入图像描述

如果我按下Tab焦点将传递到Button2、Button3、Button1 ...

在此输入图像描述

我也尝试过强制聚焦,但没有结果。

这是main.qml

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Layouts 1.3
import QtQuick.Controls 2.12

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    RowLayout{
        anchors.fill: parent

        Button{
            id: button1
            text: "Button1"
            focus: true
        }
        Button{
            text: "Button2"
            onClicked: {
                button1.forceActiveFocus()
            }
        }
        Button{
            text: "Button3"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我试图在窗口启动时得到这个:

在此输入图像描述

eyl*_*esc 6

允许突出显示的属性是visualFocus,并且如果查看文档:

VisualFocus: bool [只读]

该属性保存控件是否具有视觉焦点。当控件具有活动焦点并且焦点原因是 Qt.TabFocusReason、Qt.BacktabFocusReason 或 Qt.ShortcutFocusReason 时,此属性为 true。

一般来说,为了可视化关键焦点,此属性优于 Item::activeFocus。这确保了按键焦点仅在与按键交互时可见,而不是在通过触摸或鼠标交互时可见。

另请参见 focusReason 和 Item::activeFocus。

(强调我的)

因此,您必须使用forceActiveFocus()但传递指定的原因之一,因为如果您不传递参数,则原因是 Qt::OtherFocusReason,正如文档指出的那样:

强制主动焦点(原因)

这是一个过载功能。

强制主动关注具有给定原因的项目。

此方法将焦点设置在项目上,并确保对象层次结构中的所有祖先 FocusScope 对象也获得焦点。

该方法是在Qt 5.1中引入的。

另请参见 activeFocus 和 Qt::FocusReason。


强制主动焦点()

强制主动关注该项目。

此方法将焦点设置在项目上,并确保对象层次结构中的所有祖先 FocusScope 对象也获得焦点。

焦点改变的原因是 Qt::OtherFocusReason。使用重载方法指定焦点原因,以便更好地处理焦点变化。

另请参见活动焦点。

(强调我的)

所以解决办法是:

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    RowLayout{
        anchors.fill: parent

        Button{
            id: button1
            text: "Button1"
        }
        Button{
            text: "Button2"
        }
        Button{
            text: "Button3"
        }
    }

    Component.onCompleted: button1.forceActiveFocus(Qt.TabFocusReason)
}
Run Code Online (Sandbox Code Playgroud)