使用焦点和 popup.visible 播放时 ComboBox 上的奇怪行为

Posted

技术标签:

【中文标题】使用焦点和 popup.visible 播放时 ComboBox 上的奇怪行为【英文标题】:Strange behavior on ComboBox when playing with focus and popup.visible 【发布时间】:2017-05-18 12:07:50 【问题描述】:

当我尝试执行此代码时,我有一个奇怪的行为让我很恼火:

import QtQuick 2.7
import QtQuick.Controls 2.0

ApplicationWindow 
    id: window
    visible: true
    width: 640
    height: 480

    Rectangle 
        color: "green"
        width: parent.width/2
        height: parent.height
        anchors.right : parent.right


        ComboBox 
            id:combo
            popup.visible: combo.activeFocus
            model: [ "Banana", "Apple", "Coconut" ]
        

    
    CheckBox 
        id:check
    

如果我点击CheckBox,然后点击ComboBoxComboBox.popup将在 1 毫秒内出现然后消失。 我不明白为什么因为activeFocus = true

你知道为什么吗?

【问题讨论】:

你选择了一些东西,所以 popup.close() 将被调用,设置 popup.visible = false。你期待什么? 什么意思?我选择了ComboBox:我点击了CheckBox。然后我点击ComboBox。所以我选择了ComboBox,所以现在的重点是ComboBox。但是,如果双击ComboBox 而不是单击,它会正常工作。 这种用例根本没有想到。我可以想象那里发生的是 ComboBox 接收鼠标事件并将其传递给处理焦点的基类实现。控件获得主动焦点和繁荣,弹出窗口打开。然后执行返回到 ComboBox 的鼠标事件处理程序,该处理程序会像在正常情况下一样切换弹出窗口的可见性,因此弹出窗口立即关闭。它可以通过在进行焦点处理之前查询弹出窗口的可见性来轻松修复。随时报告错误。 @jpnurmi:这也是我得出的结论。但是我看不到哪里有要修复的错误。您唯一能做的就是首先处理鼠标事件——这将有助于(通过覆盖popup.visible 的绑定)来保持它的显示。但这里唯一有效改变的是 popup.visible: combo.activeFocus 将被解除绑定,您可以节省时间,只需删除该行。如果您只想让一个函数从外部显示它,请创建一个 function show() forceActiveFocus(); popup.open() 并调用它而不是 forceActiveFocus() 【参考方案1】:

如果您遵循导致它的事件链,则此行为是意料之中的:

    你点击ComboBox ComboBox 获得activeFocus ComboBox.popup 变为 visible 点击被处理,切换可见性 -> ComboBox 变得不可见。

删除线

popup.visible: combo.activeFocus

你很好。

改为通过open()close() 控制可见性。

【讨论】:

我想你误解了我的问题。当我点击 on ComboBox 时,Popup 会出现然后消失。 仅当我在单击ComboBox 之前单击CheckBox 时才会发生这种情况。 是的,我在阅读时弄混了一些东西。现在这应该解释出了什么问题。 谢谢你的解释,我明天或周一试试,看我什么时候可以做这个项目 所以我使用open 来控制可见性,它几乎可以按我的意愿工作。唯一的问题是,如果我使用open 来显示Popup,则会出现弹出窗口,但在ComboBox 选择的当前值上不会有任何Highlight Rectangle。但是,如果我通过单击ComboBox 本身打开ComboBoxHighlight Rectangle 将位于当前值上。你知道为什么吗?

以上是关于使用焦点和 popup.visible 播放时 ComboBox 上的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

如何删除焦点转移到不可编辑的 JTextComponent 时播放的声音

音频焦点问题

管理音频焦点

实测Android音频的焦点获取和归还

实测Android音频的焦点获取和归还

实测Android音频的焦点获取和归还