前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Qml失焦问题

Qml失焦问题

作者头像
Qt君
发布2019-07-15 20:19:27
2.3K0
发布2019-07-15 20:19:27
举报
文章被收录于专栏:跟Qt君学编程跟Qt君学编程

Qml常见诡异失焦情况一般为明明设置了某一控件的焦点, 实际却是不生效。这到底时什么情况呢?用例子来分析这种情况。

1.常见失焦情况

  • 被其他控件抢夺;
  • 误以为设置成功。

2.关于控件被抢夺的情况

2.1 先看下列例子

代码语言:javascript
复制
Dialog {
    id: dialog
    width: 100; height: 100
    onHidden: {
        dialog.forceReset() // restore focus to 'yes' button
    }
}

Rectangle {
    width: 100; height: 200
    color: activeFocus ? "red" : "lightblue"

    MouseArea {
        anchors.fill: parent
        onClicked: {
            parent.forceActiveFocus()
            dialog.hide();
        }
    }
}

2.2 为什么这样会导致Rectangle失焦呢?

  • 当按钮按下,Dialog被关闭并恢复其原来的焦点状态;
  • 因为dialog.hide()调用后dialog重新获得了焦点。

2.3 应该这种情况应该怎么做?

  • 确保设置焦点后的逻辑不能再有其他设置焦点的行为;
  • 将焦点设置放到最后执行;
  • 可以使用定时器延时执行,确保其他焦点被还原的同时自己却又是最后获得焦点。

3.一般控件获得焦点的情况

3.1 直接设置获得焦点

  • 当onClicked被触发调用Rectangle的forceActiveFocus,以至于获得焦点;
  • 也可以直接设置focus的值来获得焦点。
代码语言:javascript
复制
Rectangle {
    width: 100; height: 200
    focus: true
    color: activeFocus ? "red" : "lightblue"

    MouseArea {
        anchors.fill: parent
        onClicked: parent.forceActiveFocus()
    }
}

3.2 间接获得焦点

  • 当FocusScope获得了焦点,由于rect事先设置了focus:true间接地获得焦点了。
代码语言:javascript
复制
FocusScope {
    id: scope
    width: 100; height: 200
    focus: false

    Rectangle {
        id: rect
        anchors.fill: parent
        focus: true
        color: activeFocus ? "red" : "lightblue"
    }
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Qt君 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.常见失焦情况
  • 2.关于控件被抢夺的情况
    • 2.1 先看下列例子
      • 2.2 为什么这样会导致Rectangle失焦呢?
        • 2.3 应该这种情况应该怎么做?
        • 3.一般控件获得焦点的情况
          • 3.1 直接设置获得焦点
            • 3.2 间接获得焦点
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档