使用焦点和 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 上的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章