QML之FocusScope的理解与使用

一、焦点跳转示例图

可以看出1、2、3都有焦点输出,然而4因为编辑框和矩形框都没有接收焦点为true所以没有输出,其中1、2设置了编辑框接收焦点,3设置的是矩形框接收焦点。
在这里插入图片描述

二、个人理解

FocusScope是一个没有外观的属性,其主要作用为传递接收到的焦点给包含的控件(注意焦点是主动传递给该对象),当传递的焦点遇到首个Focus值为true的控件时将不再传递。

三、源码

main.qml

import QtQuick 2.12
import QtQuick.Window 2.12

import QtQuick.Controls 2.12

Window {
    
    
    visible: true
    width: 640
    height: 480

    MLineEdit{
    
    
        id: i1
        // 设置标识名
        name:"i1111"
        // 默认包含焦点
        focus: true
        // 当前控件包含焦点,按下Tab跳转到id为i2的控件上
        KeyNavigation.tab: i2
        // 编辑框接收焦点
        inputRef.focus: true
    }

    MLineEdit{
    
    
        id: i2
        // 设置标识名
        name:"i2222"
        // 设置当前控件的顶部是i1的底部(相当于当前控件的头挨着控件i1的尾)
        anchors.top: i1.bottom
        // 顶部边距为5
        anchors.topMargin: 5
        // 当前控件包含焦点,按下Tab跳转到id为i1的控件上
        KeyNavigation.tab: i3
        // 编辑框接收焦点
        inputRef.focus: true
    }

    MLineEdit{
    
    
        id: i3
        // 设置标识名
        name:"i3333"
        // 设置当前控件的顶部是i1的底部(相当于当前控件的头挨着控件i1的尾)
        anchors.top: i2.bottom
        // 顶部边距为5
        anchors.topMargin: 5
        // 当前控件包含焦点,按下Tab跳转到id为i1的控件上
        KeyNavigation.tab: i4

        // 设置rect对象接受焦点
        rectRef.focus: true
    }

    MLineEdit{
    
    
        id: i4
        // 设置标识名
        name:"i4444"
        // 设置当前控件的顶部是i1的底部(相当于当前控件的头挨着控件i1的尾)
        anchors.top: i3.bottom
        // 顶部边距为5
        anchors.topMargin: 5
        // 当前控件包含焦点,按下Tab跳转到id为i1的控件上
        KeyNavigation.tab: i1
    }
}

MLineEdit.qml

import QtQuick 2.0

FocusScope{
    
    
    id: root
    width: 96
    height: 20
    // 创建标识变量
    property string name

    // 创建控件rect的别名为inputRef
    property alias rectRef: rect
    Rectangle {
    
    
        id:rect
        visible: true;
        // 边框色及背景色
        border.color: "red"
        color: "skyblue"

        // 铺满父对象
        anchors.fill:parent
    }

    // 创建控件input的别名为inputRef
    property alias inputRef: input
    TextInput {
    
    
        id:input
        // 铺满父对象
        anchors.fill: parent
        anchors.margins: 4
    }
    onFocusChanged: {
    
    
        // 当前有焦点进入
        if(focus) {
    
    
            // 输入框有焦点进入
            if(input.focus) {
    
    
                console.log(name + " input:" + focus)
            }
            // 矩形框有焦点进入
            else if(rect.focus) {
    
    
                console.log(name + " rect:" + focus)
            }
        }
    }
}

总结

注意FocusScope需要主动传入焦点以及注意焦点拦截及没有接收焦点等情况。

友情提示——哪里看不懂可私哦,让我们一起互相进步吧
(创作不易,请留下一个免费的赞叭 谢谢 o/)

注:文章为作者编程过程中所遇到的问题和总结,内容仅供参考,若有错误欢迎指出。
注:如有侵权,请联系作者删除