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"
        }
    }
}
我试图在窗口启动时得到这个:
允许突出显示的属性是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)
}